Rarefaction curves
All samples have sufficient read depth, except for 37297 and 27281 -
these sample should possibly be removed
## Warning: Could not find a column named OTU/ASV in otutable, using rownames as
## OTU ID's
## Warning: Could not find a column named OTU/ASV in taxonomy, using rownames as
## OTU ID's
## Warning: Could not find a column named OTU/ASV in otutable, using rownames as
## OTU ID's
## Warning: Could not find a column named OTU/ASV in taxonomy, using rownames as
## OTU ID's
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 5
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 57
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 8
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 2
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 9
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 2
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 29
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 11
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 9
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 9
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 4
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 2
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 9
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 99
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 9
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 2
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 2
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 5
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 3
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 2
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 9
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 7
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 5
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 3
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 13
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 2
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 18
## Warning in vegan::rarefy(abund[i, ], n): most observed count data have counts
## 1, but smallest count is 46

Do we have any positive or negative controls?
LS0tDQp0aXRsZTogIkl0YWxpYW4gcHJldGVybXMgMTZTIGFuZCB2aXJvbWUgYW5hbHlzaXMiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIG51bWJlcl9zZWN0aW9uczogVFJVRQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCmBgYHtyLCBpbmNsdWRlPUZ9DQpzdWJkaXJfbmFtZSA8LSAiSXRhbGlhbiBwcmV0ZXJtcyAxNlMgYW5kIHZpcm9tZSBhbmFseXNpcyINCg0KI1NldCB3b3JraW5nIGRpcmVjdG9yeSB0byBzY3JpcHQgZGlyZWN0b3J5DQojc2V0d2QoZGlybmFtZShyc3R1ZGlvYXBpOjpnZXRBY3RpdmVEb2N1bWVudENvbnRleHQoKSRwYXRoKSkNCg0KI0xvYWQgYW5kIHByZXBhcmUgT1RVLXRhYmxlcyArIGNvbG9yIHNjYWxlIGV0Yy4NCnNvdXJjZSgiQW5hbHlzaXMwX2ZpbGVfbG9hZGluZ19hbmRfcHJlcC5SIikNCg0KZGlyLmNyZWF0ZSgicmVzdWx0cyIsIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFKQ0KDQp0aGVtZV9zZXQodGhlbWVfY2xhc3NpYyhiYXNlX2ZhbWlseSA9ICJzYW5zIikpICNzYW5zID0gVFQgQXJpYWwsIG1vbm8gPSBUVCBjb3VyaWVyIG5ldywgc2VyaWYgPSBUVCBUaW1lcyBuZXcgcm9tYW4gIA0KDQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTgsIGZpZy5mdWxsd2lkdGggPSBUUlVFKQ0KDQpgYGANCg0KIyBTZXF1ZW5jaW5nIGRlcHRoDQpCb3RoIGJhY3RlcmlhbCBhbmQgdmlyYWwgc2FtcGxlcyBoYXZlIHNvbWUgdmVyeSBsb3ctcmVhZCBzYW1wbGVzIC0gZXNwZWNpYWxseSBhdCAxIERheXMNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGfQ0KIyNDaGVjayByZWFkIGRlcHRoDQoNCiNCYWN0ZXJpYQ0KDQpzZHQgPSBkYXRhLnRhYmxlKGFzKHNhbXBsZV9kYXRhKFBTQiksICJkYXRhLmZyYW1lIiksDQogICAgICAgICAgICAgICAgIFRvdGFsUmVhZHMgPSBzYW1wbGVfc3VtcyhQU0IpLCBrZWVwLnJvd25hbWVzID0gVFJVRSkNCnNldG5hbWVzKHNkdCwgInJuIiwgIlNhbXBsZUlEIikNCnBTZXFEZXB0aCA9IGdncGxvdChzZHQsIGFlcyhUb3RhbFJlYWRzKSkgKyBnZW9tX2hpc3RvZ3JhbSgpICsgZ2d0aXRsZSgiQmFjdGVyaWFsIHNlcXVlbmNpbmcgRGVwdGgiKQ0KDQojcFNlcURlcHRoDQoNCnBTZXFEZXB0aCArIA0KICBmYWNldF93cmFwKH5EYXlzKQ0KDQojVmlyb21lDQoNCnNkdCA9IGRhdGEudGFibGUoYXMoc2FtcGxlX2RhdGEoUFNWKSwgImRhdGEuZnJhbWUiKSwNCiAgICAgICAgICAgICAgICAgVG90YWxSZWFkcyA9IHNhbXBsZV9zdW1zKFBTViksIGtlZXAucm93bmFtZXMgPSBUUlVFKQ0Kc2V0bmFtZXMoc2R0LCAicm4iLCAiU2FtcGxlSUQiKQ0KcFNlcURlcHRoID0gZ2dwbG90KHNkdCwgYWVzKFRvdGFsUmVhZHMpKSArIGdlb21faGlzdG9ncmFtKCkgKyBnZ3RpdGxlKCJWaXJhbCBzZXF1ZW5jaW5nIERlcHRoIikNCg0KI3BTZXFEZXB0aA0KDQpwU2VxRGVwdGggKyANCiAgZmFjZXRfd3JhcCh+RGF5cykNCmBgYA0KDQojIFJhcmVmYWN0aW9uIGN1cnZlcw0KDQpBbGwgc2FtcGxlcyBoYXZlIHN1ZmZpY2llbnQgcmVhZCBkZXB0aCwgZXhjZXB0IGZvciAzNzI5NyBhbmQgMjcyODEgIC0gdGhlc2Ugc2FtcGxlIHNob3VsZCBwb3NzaWJseSBiZSByZW1vdmVkDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRn0NClBTQmFtcCA8LSBhbXB2aXMyOjphbXBfbG9hZChQU0IpDQoNCnJhci5iYWMgPC0gYW1wX3JhcmVjdXJ2ZSgNCiAgUFNCYW1wLA0KICBzdGVwc2l6ZSA9IDEwMDAsDQogIGNvbG9yX2J5ID0gIkRheXMiLA0KICBmYWNldF9ieSAgPSAiRGF5cyIpICsNCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZT1UUlVFKSArDQogIGdlb21fZGwoYWVzKGxhYmVsID0gZGVzY3JpcHRpb24pLCBtZXRob2QgPSBsaXN0KGRsLnRyYW5zKHggPSB4ICsgMC4wKSwgImxhc3QucG9pbnRzIiwgY2V4ID0gMC44KSkgKw0KICAjdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGdndGl0bGUoIkJhY3RlcmlhbCByYXJlZmFjdGlvbiBjdXJ2ZSIpDQoNClBTVmFtcCA8LSBhbXB2aXMyOjphbXBfbG9hZChQU1Yubm8ucmVhbG0pDQoNCnJhci52aXIgPC0gYW1wX3JhcmVjdXJ2ZSgNCiAgUFNWYW1wLA0KICBzdGVwc2l6ZSA9IDEwMDAsDQogIGNvbG9yX2J5ID0gIkRheXMiLA0KICBmYWNldF9ieSA9ICJEYXlzIg0KKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGU9VFJVRSkgKw0KICBnZW9tX2RsKGFlcyhsYWJlbCA9IGRlc2NyaXB0aW9uKSwgbWV0aG9kID0gbGlzdChkbC50cmFucyh4ID0geCArIDAuMCksICJsYXN0LnBvaW50cyIsIGNleCA9IDAuOCkpICsNCiAgI3RoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBnZ3RpdGxlKCJWaXJhbCByYXJlZmFjdGlvbiBjdXJ2ZSIpDQogIA0KcGxvdF9ncmlkKHJhci5iYWMscmFyLnZpcikNCmBgYA0KDQpEbyB3ZSBoYXZlIGFueSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBjb250cm9scz8NCg0KIyBWaXJhbCB0YXhvbm9teSBzdGF0cw0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBUfQ0KdG90YWxfcmVhZHMgPC0gc3VtKHNhbXBsZV9zdW1zKFBTVikpDQoNCiNSZWFsbS1sZXZlbA0KIyBub19yZWFsbSA8LSBzdWJzZXRfdGF4YShQU1YsUmVhbG09PSJVbmNsYXNzaWZpZWQiKQ0KIyAxLXN1bShzYW1wbGVfc3Vtcyhub19yZWFsbSkpL3RvdGFsX3JlYWRzDQoNCiNDbGFzcw0KIyBub19jbGFzcyA8LSBzdWJzZXRfdGF4YShQU1YsQ2xhc3M9PSJVbmNsYXNzaWZpZWQiKQ0KIyAxLXN1bShzYW1wbGVfc3Vtcyhub19jbGFzcykpL3RvdGFsX3JlYWRzDQoNCiNPcmRlcg0Kbm9fb3JkZXIgPC0gc3Vic2V0X3RheGEoUFNWLE9yZGVyPT0iVW5jbGFzc2lmaWVkIikNCjEtc3VtKHNhbXBsZV9zdW1zKG5vX29yZGVyKSkvdG90YWxfcmVhZHMNCg0KI0ZhbWlseQ0Kbm9fZmFtaWx5IDwtIHN1YnNldF90YXhhKFBTVixGYW1pbHk9PSJVbmNsYXNzaWZpZWQiKQ0KMS1zdW0oc2FtcGxlX3N1bXMobm9fZmFtaWx5KSkvdG90YWxfcmVhZHMNCg0KI0dlbnVzDQpub19nZW51cyA8LSBzdWJzZXRfdGF4YShQU1YsR2VudXM9PSJVbmNsYXNzaWZpZWQiKQ0KMS1zdW0oc2FtcGxlX3N1bXMobm9fZ2VudXMpKS90b3RhbF9yZWFkcw0KDQojU3BlY2llcw0Kbm9fc3BlY2llcyA8LSBzdWJzZXRfdGF4YShQU1YsU3BlY2llcz09IlVuY2xhc3NpZmllZCIpDQoxLXN1bShzYW1wbGVfc3Vtcyhub19zcGVjaWVzKSkvdG90YWxfcmVhZHMNCg0KI0NhdWRvdmlyaWNldGVzDQpjYXVkb3ZpcmFsZXMgPC0gc3Vic2V0X3RheGEoUFNWLENsYXNzPT0iQ2F1ZG92aXJpY2V0ZXMiKQ0Kc3VtKHNhbXBsZV9zdW1zKGNhdWRvdmlyYWxlcykpL3RvdGFsX3JlYWRzDQoNCmNhdWRvdmlyYWxlc191bmNsIDwtIHN1YnNldF90YXhhKGNhdWRvdmlyYWxlcyxHZW51cz09IlVuY2xhc3NpZmllZCIpDQpzdW0oc2FtcGxlX3N1bXMoY2F1ZG92aXJhbGVzX3VuY2wpKS9zdW0oc2FtcGxlX3N1bXMoY2F1ZG92aXJhbGVzKSkNCg0Kc3VtKHNhbXBsZV9zdW1zKGNhdWRvdmlyYWxlc191bmNsKSkvdG90YWxfcmVhZHMNCiNDbGFzc2lmaWVkIGNhdWRvdmlyYWxlcw0KKHN1bShzYW1wbGVfc3VtcyhjYXVkb3ZpcmFsZXMpKS1zdW0oc2FtcGxlX3N1bXMoY2F1ZG92aXJhbGVzX3VuY2wpKSkvdG90YWxfcmVhZHMNCmBgYA0KDQojIEJhcnBsb3RzDQoNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD00LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCg0Kc2woUFNCLmdlbnVzLHRheF9nbG9tKFBTQiwgIkdlbnVzIiwgTkFybSA9IEZBTFNFKSkNCg0KcHMwIDwtIHRyYW5zZm9ybV9zYW1wbGVfY291bnRzKFBTQi5nZW51cywgZnVuY3Rpb24oeCkgeCAvIHN1bSh4KSkNCg0KcHMxIDwtIG1lcmdlX3NhbXBsZXMocHMwLCAiRGF5cyIpDQoNCnBzMiA8LSB0cmFuc2Zvcm1fc2FtcGxlX2NvdW50cyhwczEsIGZ1bmN0aW9uKHgpIHggLyBzdW0oeCkpDQoNCmRmIDwtIHBzbWVsdChwczIpDQoNCiNSZXBsYWNlIG1pc3NpbmcgdmFsdWVzIHdpdGggTkENCmRmW2RmPT0iIl0gPC0gTkENCg0KI1NlbGVjdCBsYXN0IG5vbi1lbXB0eSB0YXhvbm9taWMgcmFuaw0KZGYkdGF4IDwtIGFwcGx5KGRmLCAxLCBmdW5jdGlvbih4KSB0YWlsKHN0YXRzOjpuYS5vbWl0KHgpLCAxKSkNCg0KI0FkZCAidW5rbm93biIgdG8gdGF4b25vbXkgY29sdW1ucyB3aGVyZSBnZW51cyBpcyBub3QgY2xhc3NpZmllZCANCmRmJHRheFtpcy5uYShkZiRHZW51cyldIDwtIHBhc3RlMChkZiR0YXhbaXMubmEoZGYkR2VudXMpXSwiIHVua25vd24iKQ0KDQojQXJyYW5nZSBzYW1wbGVzIGJ5IG1lYW4gYWJ1bmRhbmNlDQoNCnRvcCA8LSBkZiAlPiUNCiAgZ3JvdXBfYnkoU2FtcGxlLCB0YXgpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXplKE1lYW4gPSBtZWFuKEFidW5kYW5jZSkpICU+JQ0KICBkcGx5cjo6YXJyYW5nZSgtTWVhbikNCiNTaG93IHRvcA0KI3RvcA0KDQp0b3AxMCA8LSB0b3AkdGF4WzE6MjBdDQojU2VsZWN0IGRpc2VyZWQgdGF4b25vbWljIGxldmVsDQpkZjAgPC0gZGYgJT4lDQogIG11dGF0ZSh0YXggPSBmY3Rfb3RoZXIodGF4LCBjKGFzLm1hdHJpeCh0b3AxMCkpKSkNCg0KI0JhciBjaGFydA0KDQpiYXJfYmFjIDwtIGdncGxvdChkZjAsIGFlcyhTYW1wbGUsIEFidW5kYW5jZSwgZmlsbCA9IGZjdF9yZW9yZGVyKHRheCwgQWJ1bmRhbmNlLCAuZnVuID0gbWVhbikpKSArIA0KICBnZW9tX2NvbCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPXJlcChjb2xfZmlsLDUpLG5hbWU9IkdlbnVzIikrDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkrDQogIGdndGl0bGUoIkJhY3RlcmlhIikgKw0KICB4bGFiKCJEYXlzIGFmdGVyIGJpcnRoIikgKw0KICB5bGFiKCJSZWxhdGl2ZSBhYnVuZGFuY2UiKQ0KDQojIyMjIyMjIyMjIyMjI0JhY3RlcmlhIEZhbWlseSBsZXZlbA0KDQpiYWMucGh5bCA8LSB0YXhfZ2xvbShQU0IsICJGYW1pbHkiLCBOQXJtID0gRkFMU0UpDQoNCnBzMCA8LSB0cmFuc2Zvcm1fc2FtcGxlX2NvdW50cyhiYWMucGh5bCwgZnVuY3Rpb24oeCkgeCAvIHN1bSh4KSkNCg0KcHMxIDwtIG1lcmdlX3NhbXBsZXMocHMwLCAiRGF5cyIpDQoNCnBzMiA8LSB0cmFuc2Zvcm1fc2FtcGxlX2NvdW50cyhwczEsIGZ1bmN0aW9uKHgpIHggLyBzdW0oeCkpDQoNCmRmIDwtIHBzbWVsdChwczIpDQoNCiNSZXBsYWNlIG1pc3NpbmcgdmFsdWVzIHdpdGggTkENCmRmW2RmPT0iIl0gPC0gTkENCg0KI1NlbGVjdCBsYXN0IG5vbi1lbXB0eSB0YXhvbm9taWMgcmFuaw0KZGYkdGF4IDwtIGFwcGx5KGRmLCAxLCBmdW5jdGlvbih4KSB0YWlsKHN0YXRzOjpuYS5vbWl0KHgpLCAxKSkNCg0KI0FkZCAidW5rbm93biIgdG8gdGF4b25vbXkgY29sdW1ucyB3aGVyZSBnZW51cyBpcyBub3QgY2xhc3NpZmllZCANCmRmJHRheFtpcy5uYShkZiRHZW51cyldIDwtIHBhc3RlMChkZiR0YXhbaXMubmEoZGYkR2VudXMpXSwiIHVua25vd24iKQ0KDQojQXJyYW5nZSBzYW1wbGVzIGJ5IG1lYW4gYWJ1bmRhbmNlDQoNCnRvcCA8LSBkZiAlPiUNCiAgZ3JvdXBfYnkoU2FtcGxlLCB0YXgpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXplKE1lYW4gPSBtZWFuKEFidW5kYW5jZSkpICU+JQ0KICBkcGx5cjo6YXJyYW5nZSgtTWVhbikNCiNTaG93IHRvcA0KI3RvcA0KDQp0b3AxMCA8LSB0b3AkdGF4WzE6MjBdDQojU2VsZWN0IGRpc2VyZWQgdGF4b25vbWljIGxldmVsDQpkZjAgPC0gZGYgJT4lDQogIG11dGF0ZSh0YXggPSBmY3Rfb3RoZXIodGF4LCBjKGFzLm1hdHJpeCh0b3AxMCkpKSkNCg0KI0JhciBjaGFydA0KDQpiYXJfYmFjX2ZhbSA8LSBnZ3Bsb3QoZGYwLCBhZXMoU2FtcGxlLCBBYnVuZGFuY2UsIGZpbGwgPSBmY3RfcmVvcmRlcih0YXgsIEFidW5kYW5jZSwgLmZ1biA9IG1lYW4pKSkgKyANCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1yZXAoY29sX2ZpbCw1KSxuYW1lPSJGYW1pbHkiKSsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKSsNCiAgZ2d0aXRsZSgiQmFjdGVyaWEiKSArDQogIHhsYWIoIkRheXMgYWZ0ZXIgYmlydGgiKSArDQogIHlsYWIoIlJlbGF0aXZlIGFidW5kYW5jZSIpDQoNCiNiYXJfYmFjDQoNCiNWaXJvbWUNCg0KYmFjLnBoeWwgPC0gdGF4X2dsb20oUFNWLCB0YXhyYW5rPSJPcmRlciIsIE5Bcm0gPSBGQUxTRSkNCg0KcHMwIDwtIHRyYW5zZm9ybV9zYW1wbGVfY291bnRzKGJhYy5waHlsLCBmdW5jdGlvbih4KSB4IC8gc3VtKHgpKQ0KDQpwczEgPC0gbWVyZ2Vfc2FtcGxlcyhwczAsICJEYXlzIikNCg0KcHMyIDwtIHRyYW5zZm9ybV9zYW1wbGVfY291bnRzKHBzMSwgZnVuY3Rpb24oeCkgeCAvIHN1bSh4KSkNCg0KDQojU2VsZWN0IGRlc2lyZWQgcmFuaw0KDQpkZiA8LSBwc21lbHQocHMyKQ0KDQojU2VsZWN0IGxhc3Qgbm9uLWVtcHR5IHRheG9ub21pYyByYW5rDQoNCmRmW2RmPT0iIl0gPC0gTkENCg0KZGYkdGF4IDwtIGFwcGx5KGRmLCAxLCBmdW5jdGlvbih4KSB0YWlsKG5hLm9taXQoeCksIDEpKQ0KDQp0b3AgPC0gZGYgJT4lDQogIGdyb3VwX2J5KFNhbXBsZSwgdGF4KSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZShNZWFuID0gbWVhbihBYnVuZGFuY2UpKSAlPiUNCiAgZHBseXI6OmFycmFuZ2UoLU1lYW4pDQojU2hvdyB0b3ANCiN0b3ANCg0KdG9wMTAgPC0gdG9wJHRheFsxOjIwXQ0KZGYwIDwtIGRmICU+JQ0KICBtdXRhdGUodGF4ID0gZmN0X290aGVyKHRheCwgYyhhcy5tYXRyaXgodG9wMTApKSkpDQoNCiNDaGFuZ2UgIlVua25vd24iIHRvICJVbmtub3duIHZpcnVzIiBhbmQgIk5vX21hdGNoIiB0byAiTm8gbWF0Y2giDQoNCmRmMCR0YXggPC0gcGx5cjo6cmV2YWx1ZShkZjAkdGF4LCBjKCJVbmtub3duIj0iVW5rbm93biB2aXJ1cyIpKQ0KZGYwJHRheCA8LSBwbHlyOjpyZXZhbHVlKGRmMCR0YXgsIGMoIm5vX21hdGNoIj0iTm8gbWF0Y2giKSkNCg0KI0FkZCAidW5rbm93biIgdG8gdGF4b25vbXkgY29sdW1ucyB3aGVyZSBnZW51cyBpcyBub3QgY2xhc3NpZmllZCANCiMkdGF4W2lzLm5hKGRmJEdlbnVzKV0gPC0gcGFzdGUwKGRmJHRheFtpcy5uYShkZiRHZW51cyldLCIgdW5rbm93biIpDQoNCiNCYXIgY2hhcnQNCg0KYmFyX3Zpcl9mYW1pbHkgPC0gZ2dwbG90KGRmMCwgYWVzKFNhbXBsZSwgQWJ1bmRhbmNlLCBmaWxsID0gZmN0X3Jlb3JkZXIodGF4LCBBYnVuZGFuY2UsIC5mdW4gPSBtZWFuKSkpICsgDQogIGdlb21fY29sKCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9cmVwKGNvbF9maWwsNSksbmFtZT0iT3JkZXIiKSsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKSsNCiAgZ2d0aXRsZSgiVmlyb21lIikgKw0KICB4bGFiKCJEYXlzIGFmdGVyIGJpcnRoIikgKw0KICB5bGFiKCJSZWxhdGl2ZSBhYnVuZGFuY2UiKQ0KDQojYmFyX3Zpcl9mYW1pbHkNCg0KcGxvdF9ncmlkKGJhcl9iYWNfZmFtLGJhcl92aXJfZmFtaWx5KQ0KYGBgDQoNCiMjIEhvc3QgcHJlZGljdGlvbnMNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD00LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCg0Kc2woUFNWLmdlbnVzLHRheF9nbG9tKFBTVi5ob3N0LCAiR2VudXMiLCBOQXJtID0gRkFMU0UpKQ0KDQpwczAgPC0gdHJhbnNmb3JtX3NhbXBsZV9jb3VudHMoUFNWLmdlbnVzLCBmdW5jdGlvbih4KSB4IC8gc3VtKHgpKQ0KDQpwczEgPC0gbWVyZ2Vfc2FtcGxlcyhwczAsICJEYXlzIikNCg0KcHMyIDwtIHRyYW5zZm9ybV9zYW1wbGVfY291bnRzKHBzMSwgZnVuY3Rpb24oeCkgeCAvIHN1bSh4KSkNCg0KZGYgPC0gcHNtZWx0KHBzMikNCg0KI1JlcGxhY2UgbWlzc2luZyB2YWx1ZXMgd2l0aCBOQQ0KZGZbZGY9PSIiXSA8LSBOQQ0KDQojU2VsZWN0IGxhc3Qgbm9uLWVtcHR5IHRheG9ub21pYyByYW5rDQpkZiR0YXggPC0gYXBwbHkoZGYsIDEsIGZ1bmN0aW9uKHgpIHRhaWwoc3RhdHM6Om5hLm9taXQoeCksIDEpKQ0KDQojQWRkICJ1bmtub3duIiB0byB0YXhvbm9teSBjb2x1bW5zIHdoZXJlIGdlbnVzIGlzIG5vdCBjbGFzc2lmaWVkIA0KZGYkdGF4W2lzLm5hKGRmJEdlbnVzKV0gPC0gcGFzdGUwKGRmJHRheFtpcy5uYShkZiRHZW51cyldLCIgdW5rbm93biIpDQoNCiNBcnJhbmdlIHNhbXBsZXMgYnkgbWVhbiBhYnVuZGFuY2UNCg0KdG9wIDwtIGRmICU+JQ0KICBncm91cF9ieShTYW1wbGUsIHRheCkgJT4lDQogIGRwbHlyOjpzdW1tYXJpemUoTWVhbiA9IG1lYW4oQWJ1bmRhbmNlKSkgJT4lDQogIGRwbHlyOjphcnJhbmdlKC1NZWFuKQ0KI1Nob3cgdG9wDQojdG9wDQoNCnRvcDEwIDwtIHRvcCR0YXhbMToxOF0NCiNTZWxlY3QgZGlzZXJlZCB0YXhvbm9taWMgbGV2ZWwNCmRmMCA8LSBkZiAlPiUNCiAgbXV0YXRlKHRheCA9IGZjdF9vdGhlcih0YXgsIGMoYXMubWF0cml4KHRvcDEwKSkpKQ0KDQojQmFyIGNoYXJ0DQoNCmJhcl9ob3N0IDwtIGdncGxvdChkZjAsIGFlcyhTYW1wbGUsIEFidW5kYW5jZSwgZmlsbCA9IGZjdF9yZW9yZGVyKHRheCwgQWJ1bmRhbmNlLCAuZnVuID0gbWVhbikpKSArIA0KICBnZW9tX2NvbCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPXJlcChjb2xfZmlsLDUpLG5hbWU9IkdlbnVzIikrDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkrDQogIGdndGl0bGUoIlZpcmFsIGhvc3RzIikgKw0KICB4bGFiKCJEYXlzIGFmdGVyIGJpcnRoIikgKw0KICB5bGFiKCJSZWxhdGl2ZSBhYnVuZGFuY2UiKQ0KDQojYmFyX2hvc3QNCg0KcGxvdF9ncmlkKGJhcl9iYWMsYmFyX2hvc3QpDQoNCmBgYA0KDQojIEFidW5kYW5jZSBoZWF0bWFwcw0KDQojIyBCYWN0ZXJpYQ0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KI0xvYWQgcGh5bG9zZXEgZmlsZXMgdG8gYW1wdmlzMiBmb3JtYXQNClBTQmFtcCA8LSBhbXB2aXMyOjphbXBfbG9hZChQU0IpDQoNCiMjUGxvdCBoZWFtYXANCg0KIyNCYWN0ZXJpYQ0KYW1wX2JhY19nZW51cyA8LSBhbXBfaGVhdG1hcChQU0JhbXAsDQogICAgICAgICAgICBncm91cF9ieSA9ICJUd2luX3BhaXJzX2JpcyIsDQogICAgICAgICAgICBmYWNldF9ieSA9ICJEYXlzIiwNCiAgICAgICAgICAgIHBsb3RfdmFsdWVzID0gRkFMU0UsDQogICAgICAgICAgICB0YXhfc2hvdyA9IDMwLA0KICAgICAgICAgICAgdGF4X2FnZ3JlZ2F0ZSA9ICJHZW51cyIgLA0KICAgICAgICAgICAgdGF4X2FkZCA9IE5VTEwsDQogICAgICAgICAgICB0YXhfZW1wdHkgPSAiYmVzdCIsDQogICAgICAgICAgICBub3JtYWxpc2UgPSBUUlVFLA0KICAgICAgICAgICAgY29sb3JfdmVjdG9yID0gYygid2hpdGUiLCAicmVkIiksDQogICAgICAgICAgICBwbG90X2NvbG9yc2NhbGUgPSAic3FydCIsDQogICAgICAgICAgICBwbG90X2xlZ2VuZGJyZWFrcyA9IGMoMSwgMTAsIDI1LCA1MCkNCikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJ3aGl0ZSIsIGZpbGwgPSAid2hpdGUiKSwNCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGUgPSAtNDUsIGhqdXN0ID0gMCx2anVzdCA9IDAuMikpDQoNCmFtcF9iYWNfZ2VudXMNCg0KYGBgDQoNCiMjIFZpcm9tZQ0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KI0xvYWQgcGh5bG9zZXEgZmlsZXMgdG8gYW1wdmlzMiBmb3JtYXQNCg0KUFNWYW1wIDwtIGFtcHZpczI6OmFtcF9sb2FkKFBTVi5uby5yZWFsbSkgIA0KDQojI1Zpcm9tZQ0KDQphbXBfdmlyX2dlbnVzIDwtIGFtcF9oZWF0bWFwKFBTVmFtcCwNCiAgICAgICAgICAgIGdyb3VwX2J5ID0gIlR3aW5fcGFpcnNfdW5pcXVlIiwNCiAgICAgICAgICAgIGZhY2V0X2J5ID0gIkRheXMiLA0KICAgICAgICAgICAgcGxvdF92YWx1ZXMgPSBGQUxTRSwNCiAgICAgICAgICAgIHRheF9zaG93ID0gNDAsDQogICAgICAgICAgICB0YXhfYWdncmVnYXRlID0gIk9yZGVyIiwNCiAgICAgICAgICAgIHRheF9hZGQgPSAiQ2xhc3MiLA0KICAgICAgICAgICAgdGF4X2VtcHR5ID0gImJlc3QiLA0KICAgICAgICAgICAgbm9ybWFsaXNlID0gVFJVRSwNCiAgICAgICAgICAgIGNvbG9yX3ZlY3RvciA9IGMoIndoaXRlIiwgInJlZCIpLA0KICAgICAgICAgICAgcGxvdF9jb2xvcnNjYWxlID0gInNxcnQiLA0KICAgICAgICAgICAgcGxvdF9sZWdlbmRicmVha3MgPSBjKDEsIDEwLCAyNSwgNTApDQopICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIiksDQogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwNCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlID0gLTQ1LCBoanVzdCA9IDAsdmp1c3QgPSAwLjIpKQ0KDQoNCmFtcF92aXJfZ2VudXMNCg0KUFNWYW1wJHRheFtQU1ZhbXAkdGF4ID09ICJVbmNsYXNzaWZpZWQiXSA8LSAiIg0KDQojI1Zpcm9tZQ0KDQphbXBfdmlyX3NwZWNpZXMgPC0gYW1wX2hlYXRtYXAoUFNWYW1wLA0KICAgICAgICAgICAgZ3JvdXBfYnkgPSAiVHdpbl9wYWlyc191bmlxdWUiLA0KICAgICAgICAgICAgZmFjZXRfYnkgPSAiRGF5cyIsDQogICAgICAgICAgICBwbG90X3ZhbHVlcyA9IEZBTFNFLA0KICAgICAgICAgICAgdGF4X3Nob3cgPSA0MCwNCiAgICAgICAgICAgIHRheF9hZ2dyZWdhdGUgPSAiR2VudXMiICwNCiAgICAgICAgICAgIHRheF9hZGQgPSBOVUxMLA0KICAgICAgICAgICAgdGF4X2VtcHR5ID0gImJlc3QiLA0KICAgICAgICAgICAgbm9ybWFsaXNlID0gVFJVRSwNCiAgICAgICAgICAgIGNvbG9yX3ZlY3RvciA9IGMoIndoaXRlIiwgInJlZCIpLA0KICAgICAgICAgICAgcGxvdF9jb2xvcnNjYWxlID0gInNxcnQiLA0KICAgICAgICAgICAgcGxvdF9sZWdlbmRicmVha3MgPSBjKDEsIDEwLCAyNSwgNTApDQopICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIiksDQogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwNCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlID0gLTQ1LCBoanVzdCA9IDAsdmp1c3QgPSAwLjIpKQ0KDQphbXBfdmlyX3NwZWNpZXMNCmBgYA0KDQoNCg0KIyMgSG9zdCB2aXJvbWUNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD00LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCg0KI0xvYWQgcGh5bG9zZXEgZmlsZXMgdG8gYW1wdmlzMiBmb3JtYXQNCg0KUFNWLmhvc3QuYW1wIDwtIGFtcHZpczI6OmFtcF9sb2FkKFBTVi5ob3N0KQ0KDQphbXBfaGVhdG1hcChQU1YuaG9zdC5hbXAsDQogICAgICAgICAgICBncm91cF9ieSA9ICJUd2luX3BhaXJzX3VuaXF1ZSIsDQogICAgICAgICAgICBmYWNldF9ieSA9ICJEYXlzIiwNCiAgICAgICAgICAgIHBsb3RfdmFsdWVzID0gRkFMU0UsDQogICAgICAgICAgICB0YXhfc2hvdyA9IDQwLA0KICAgICAgICAgICAgdGF4X2FnZ3JlZ2F0ZSA9ICJHZW51cyIgLA0KICAgICAgICAgICAgdGF4X2FkZCA9ICJGYW1pbHkiLA0KICAgICAgICAgICAgdGF4X2VtcHR5ID0gImJlc3QiLA0KICAgICAgICAgICAgbm9ybWFsaXNlID0gVFJVRSwNCiAgICAgICAgICAgIGNvbG9yX3ZlY3RvciA9IGMoIndoaXRlIiwgInJlZCIpLA0KICAgICAgICAgICAgcGxvdF9jb2xvcnNjYWxlID0gInNxcnQiLA0KICAgICAgICAgICAgcGxvdF9sZWdlbmRicmVha3MgPSBjKDEsIDEwLCAyNSwgNTApDQopICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIiksDQogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwNCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlID0gLTQ1LCBoanVzdCA9IDAsdmp1c3QgPSAwLjIpKQ0KDQphbXBfaGVhdG1hcChQU1YuaG9zdC5hbXAsDQogICAgICAgICAgICBncm91cF9ieSA9ICJEYXlzIiwNCiAgICAgICAgICAgIGZhY2V0X2J5ID0gIlR3aW5fcGFpcnNfdW5pcXVlIiwNCiAgICAgICAgICAgIHBsb3RfdmFsdWVzID0gRkFMU0UsDQogICAgICAgICAgICB0YXhfc2hvdyA9IDMwLA0KICAgICAgICAgICAgdGF4X2FnZ3JlZ2F0ZSA9ICJHZW51cyIgLA0KICAgICAgICAgICAgdGF4X2FkZCA9ICJGYW1pbHkiLA0KICAgICAgICAgICAgdGF4X2VtcHR5ID0gImJlc3QiLA0KICAgICAgICAgICAgbm9ybWFsaXNlID0gVFJVRSwNCiAgICAgICAgICAgIGNvbG9yX3ZlY3RvciA9IGMoIndoaXRlIiwgInJlZCIpLA0KICAgICAgICAgICAgcGxvdF9jb2xvcnNjYWxlID0gInNxcnQiLA0KICAgICAgICAgICAgcGxvdF9sZWdlbmRicmVha3MgPSBjKDEsIDEwLCAyNSwgNTApDQopICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIiksDQogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwNCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlID0gLTQ1LCBoanVzdCA9IDAsdmp1c3QgPSAwLjIpKQ0KDQphbXBfaG9zdF9wYWlyIDwtIGFtcF9oZWF0bWFwKFBTVi5ob3N0LmFtcCwNCiAgICAgICAgICAgIGdyb3VwX2J5ID0gIlR3aW5fcGFpcnNfdW5pcXVlIiwNCiAgICAgICAgICAgIGZhY2V0X2J5ID0gIkRheXMiLA0KICAgICAgICAgICAgcGxvdF92YWx1ZXMgPSBGQUxTRSwNCiAgICAgICAgICAgIHRheF9zaG93ID0gMzAsDQogICAgICAgICAgICB0YXhfYWdncmVnYXRlID0gIkdlbnVzIiAsDQogICAgICAgICAgICB0YXhfYWRkID0gIkZhbWlseSIsDQogICAgICAgICAgICB0YXhfZW1wdHkgPSAiYmVzdCIsDQogICAgICAgICAgICBub3JtYWxpc2UgPSBUUlVFLA0KICAgICAgICAgICAgY29sb3JfdmVjdG9yID0gYygid2hpdGUiLCAicmVkIiksDQogICAgICAgICAgICBwbG90X2NvbG9yc2NhbGUgPSAic3FydCIsDQogICAgICAgICAgICBwbG90X2xlZ2VuZGJyZWFrcyA9IGMoMSwgMTAsIDI1LCA1MCkNCikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSwNCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGUgPSAtNDUsIGhqdXN0ID0gMCx2anVzdCA9IDAuMikpDQoNCmFtcF9ob3N0X3BhaXINCmBgYA0KDQoNCg0KIyBVcHNldCBwbG90DQoNCiMjIEJhY3RlcmlhDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQoNCmxpYnJhcnkoTWljcm9iaW90YVByb2Nlc3MpDQpsaWJyYXJ5KFZlbm5EaWFncmFtKQ0KbGlicmFyeShVcFNldFIpDQoNCnBzIDwtIFBTQg0KIyBwcyA8LSBzdWJzZXRfc2FtcGxlcyhwcywgIWlzLm5hKERheXMpKQ0KIyBwc0BzYW1fZGF0YSREYXlzIDwtIGFzLmZhY3Rvcihwc0BzYW1fZGF0YSREYXlzKQ0KDQp2ZW5ubGlzdCA8LSBnZXRfdmVubmxpc3Qob2JqPXBzLCBmYWN0b3JOYW1lcz0iRGF5cyIpDQp1cHNldGRhIDwtIGdldF91cHNldChvYmo9cHMsIGZhY3Rvck5hbWVzPSJEYXlzIikNCg0KdmVubnAgPC0gdmVubi5kaWFncmFtKHZlbm5saXN0LA0KICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD01LA0KICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTUsIA0KICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPU5VTEwsIA0KICAgICAgICAgICAgICAgICAgICAgICNmaWxsPWNvbF9maWwsDQogICAgICAgICAgICAgICAgICAgICAgI2NhdC5jb2w9Y29sX2ZpbCwNCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuODUsIA0KICAgICAgICAgICAgICAgICAgICAgIGZvbnRmYW1pbHkgPSAic2VyaWYiLA0KICAgICAgICAgICAgICAgICAgICAgIGZvbnRmYWNlID0gImJvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgIGNleCA9IDEuMiwNCiAgICAgICAgICAgICAgICAgICAgICBjYXQuY2V4ID0gMS4zLA0KICAgICAgICAgICAgICAgICAgICAgIGNhdC5kZWZhdWx0LnBvcyA9ICJvdXRlciIsDQogICAgICAgICAgICAgICAgICAgICAgY2F0LmRpc3Q9MC4xLA0KICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IDAuMSwgDQogICAgICAgICAgICAgICAgICAgICAgbHdkID0gMywNCiAgICAgICAgICAgICAgICAgICAgICBsdHkgPSdkb3R0ZWQnLA0KICAgICAgICAgICAgICAgICAgICAgIGltYWdldHlwZSA9ICJzdmciKQ0KZ3JpZDo6Z3JpZC5kcmF3KHZlbm5wKQ0KDQp1cHNldC5iYWMudGltZSA8LSB1cHNldCh1cHNldGRhLCANCiAgICAgIHNldHMuYmFyLmNvbG9yID0gIiM1NkI0RTkiLA0KICAgICAgb3JkZXIuYnkgPSAiZnJlcSIsIA0KICAgICAgZW1wdHkuaW50ZXJzZWN0aW9ucyA9ICJvbiIpDQoNCnVwc2V0LmJhYy50aW1lDQoNCiNsaWJyYXJ5KGdncGxvdGlmeSkNCmBgYA0KDQojIyBWaXJvbWUNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD00LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCg0KbGlicmFyeSgiTWljcm9iaW90YVByb2Nlc3MiKQ0KDQpwcyA8LSBQU1YNCiMgcHMgPC0gc3Vic2V0X3NhbXBsZXMocHMsICFpcy5uYShEYXlzKSkNCiMgcHNAc2FtX2RhdGEkRGF5cyA8LSBhcy5mYWN0b3IocHNAc2FtX2RhdGEkRGF5cykNCg0KdmVubmxpc3QgPC0gZ2V0X3Zlbm5saXN0KG9iaj1wcywgZmFjdG9yTmFtZXM9IkRheXMiKQ0KdXBzZXRkYSA8LSBnZXRfdXBzZXQob2JqPXBzLCBmYWN0b3JOYW1lcz0iRGF5cyIpDQoNCnZlbm5wIDwtIHZlbm4uZGlhZ3JhbSh2ZW5ubGlzdCwNCiAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9NSwNCiAgICAgICAgICAgICAgICAgICAgICB3aWR0aD01LCANCiAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZT1OVUxMLCANCiAgICAgICAgICAgICAgICAgICAgICAjZmlsbD1jb2xfZmlsLA0KICAgICAgICAgICAgICAgICAgICAgICNjYXQuY29sPWNvbF9maWwsDQogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjg1LCANCiAgICAgICAgICAgICAgICAgICAgICBmb250ZmFtaWx5ID0gInNlcmlmIiwNCiAgICAgICAgICAgICAgICAgICAgICBmb250ZmFjZSA9ICJib2xkIiwNCiAgICAgICAgICAgICAgICAgICAgICBjZXggPSAxLjIsDQogICAgICAgICAgICAgICAgICAgICAgY2F0LmNleCA9IDEuMywNCiAgICAgICAgICAgICAgICAgICAgICBjYXQuZGVmYXVsdC5wb3MgPSAib3V0ZXIiLA0KICAgICAgICAgICAgICAgICAgICAgIGNhdC5kaXN0PTAuMSwNCiAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSAwLjEsIA0KICAgICAgICAgICAgICAgICAgICAgIGx3ZCA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgbHR5ID0nZG90dGVkJywNCiAgICAgICAgICAgICAgICAgICAgICBpbWFnZXR5cGUgPSAic3ZnIikNCmdyaWQ6OmdyaWQuZHJhdyh2ZW5ucCkNCg0KdXBzZXQudmlyLnRpbWUgPC0gdXBzZXQodXBzZXRkYSwgDQogICAgICBzZXRzLmJhci5jb2xvciA9ICIjNTZCNEU5IiwNCiAgICAgIG9yZGVyLmJ5ID0gImZyZXEiLCANCiAgICAgIGVtcHR5LmludGVyc2VjdGlvbnMgPSAib24iKSANCg0KdXBzZXQudmlyLnRpbWUNCg0KI2xpYnJhcnkoZ2dwbG90aWZ5KQ0KYGBgDQoNCiMjIFZpcm9tZSBob3N0DQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQoNCmxpYnJhcnkoIk1pY3JvYmlvdGFQcm9jZXNzIikNCg0KcHMgPC0gUFNWLmhvc3QNCnBzIDwtIHN1YnNldF9zYW1wbGVzKHBzLCAhaXMubmEoRGF5cykpDQpwc0BzYW1fZGF0YSREYXlzIDwtIGFzLmZhY3Rvcihwc0BzYW1fZGF0YSREYXlzKQ0KDQp2ZW5ubGlzdCA8LSBnZXRfdmVubmxpc3Qob2JqPXBzLCBmYWN0b3JOYW1lcz0iRGF5cyIpDQp1cHNldGRhIDwtIGdldF91cHNldChvYmo9cHMsIGZhY3Rvck5hbWVzPSJEYXlzIikNCg0KdmVubnAgPC0gdmVubi5kaWFncmFtKHZlbm5saXN0LA0KICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD01LA0KICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTUsIA0KICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPU5VTEwsIA0KICAgICAgICAgICAgICAgICAgICAgICNmaWxsPWNvbF9maWwsDQogICAgICAgICAgICAgICAgICAgICAgI2NhdC5jb2w9Y29sX2ZpbCwNCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuODUsIA0KICAgICAgICAgICAgICAgICAgICAgIGZvbnRmYW1pbHkgPSAic2VyaWYiLA0KICAgICAgICAgICAgICAgICAgICAgIGZvbnRmYWNlID0gImJvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgIGNleCA9IDEuMiwNCiAgICAgICAgICAgICAgICAgICAgICBjYXQuY2V4ID0gMS4zLA0KICAgICAgICAgICAgICAgICAgICAgIGNhdC5kZWZhdWx0LnBvcyA9ICJvdXRlciIsDQogICAgICAgICAgICAgICAgICAgICAgY2F0LmRpc3Q9MC4xLA0KICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IDAuMSwgDQogICAgICAgICAgICAgICAgICAgICAgbHdkID0gMywNCiAgICAgICAgICAgICAgICAgICAgICBsdHkgPSdkb3R0ZWQnLA0KICAgICAgICAgICAgICAgICAgICAgIGltYWdldHlwZSA9ICJzdmciKQ0KZ3JpZDo6Z3JpZC5kcmF3KHZlbm5wKQ0KDQp1cHNldC52aXIuaG9zdC50aW1lIDwtIHVwc2V0KHVwc2V0ZGEsIA0KICAgICAgc2V0cy5iYXIuY29sb3IgPSAiIzU2QjRFOSIsDQogICAgICBvcmRlci5ieSA9ICJmcmVxIiwgDQogICAgICBlbXB0eS5pbnRlcnNlY3Rpb25zID0gIm9uIikgDQoNCnVwc2V0LnZpci5ob3N0LnRpbWUNCmBgYA0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBGLCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRn0NCiNVbmxvYWQgTWljcm9iaW90YSBQcm9jZXNzIHBhY2thZ2UgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCB0YXhfdGFibGUgZm9ybSBwaHlsb3NlcQ0KZGV0YWNoKHBhY2thZ2U6TWljcm9iaW90YVByb2Nlc3MpDQpgYGANCg0KIyBBbHBoYSBkaXZlcnNpdHkNCg0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBGLCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KDQojTm9ybWFsaXplIHRvIG1lYW4gcmVhZCBjb3VudA0KdG90YWwgPSBtZWRpYW4oc2FtcGxlX3N1bXMoUFNCKSkNCnN0YW5kZiA9IGZ1bmN0aW9uKHgsIHQ9dG90YWwpIHJvdW5kKHQgKiAoeCAvIHN1bSh4KSkpDQpQU0IuUiA9IHRyYW5zZm9ybV9zYW1wbGVfY291bnRzKFBTQiwgc3RhbmRmKQ0KDQojU2V0IGRlc2lyZWQgYWxwaGEgZGl2ZXJzaXR5IG1ldHJpY3MNCg0KYWxwaGFfbWV0IDwtIGMoIk9ic2VydmVkIiwgIlNoYW5ub24iLCAiQ2hhbzEiLCAiSW52U2ltcHNvbiIpDQoNCiMjIyMjIyMjIyMjQm94cGxvdHMNCg0KIyNUaW1lDQoNCnZhcmlhYmxlIDwtIGMoIkRheXMiKQ0KDQphbHBoYS5tZXRyaWNzLmJhYyA8LSBwbG90X3JpY2huZXNzKFBTQi5SLCBtZWFzdXJlcz1hbHBoYV9tZXQgLCB4PXZhcmlhYmxlLCBjb2xvcj12YXJpYWJsZSkgKyANCiAgZ2VvbV9ib3hwbG90KGFscGhhPTAuMSwgbHdkID0gMSkgKw0KICBzY2FsZV9jb2xvcl9qY28oKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgICAgICBheGlzLmxpbmU9ZWxlbWVudF9saW5lKHNpemU9MSksDQogICAgICAgIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZSA9IDgsIGNvbG91ciA9ICJCbGFjayIpLA0KICAgICAgICBheGlzLnRpY2tzPWVsZW1lbnRfbGluZShzaXplPTEsIGNvbG91ciA9ICJCbGFjayIpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJ3aGl0ZSIsIGZpbGwgPSAid2hpdGUiKSwNCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksDQogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgYW5nbGUgPSAwKSwNCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpDQogICkgKw0KICBsYWJzKHg9IkRheXMiLA0KICAgICAgIHk9IkFscGhhIGRpdmVyc2l0eSIpICsgDQogIGdndGl0bGUoIkJhY3RlcmlhIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDAuMTUpKSkNCg0KYWxwaGEubWV0cmljcy5iYWMNCmBgYA0KDQpgYGB7ciwgZXZhbCA9IEYsIGluY2x1ZGUgPSBGLCBlY2hvID0gRiwgd2FybmluZyA9IEZ9DQojI1JpY2huZXNzIC0gYWxsIHRpbWUgcG9pbnRzDQoNCnJpY2huZXNzID0gZXN0aW1hdGVfcmljaG5lc3MoUFNCLlIsIG1lYXN1cmVzID0gYWxwaGFfbWV0KQ0KDQojVGltZQ0KDQpyaWNoIDwtIGNiaW5kKHJpY2huZXNzLCB2YXJpYWJsZSA9IHNhbXBsZV9kYXRhKFBTQi5SKSREYXlzKQ0KDQpUdWtleUhTRChhb3YoU2hhbm5vbiB+IHZhcmlhYmxlLCByaWNoKSkNCmBgYA0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBGLCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KDQojTm9ybWFsaXplIHRvIG1lYW4gcmVhZCBjb3VudA0KdG90YWwgPSBtZWRpYW4oc2FtcGxlX3N1bXMoUFNWKSkNCnN0YW5kZiA9IGZ1bmN0aW9uKHgsIHQ9dG90YWwpIHJvdW5kKHQgKiAoeCAvIHN1bSh4KSkpDQpQU0IuUiA9IHRyYW5zZm9ybV9zYW1wbGVfY291bnRzKFBTViwgc3RhbmRmKQ0KDQojU2V0IGRlc2lyZWQgYWxwaGEgZGl2ZXJzaXR5IG1ldHJpY3MNCg0KYWxwaGFfbWV0IDwtIGMoIk9ic2VydmVkIiwgIlNoYW5ub24iLCAiQ2hhbzEiLCAiSW52U2ltcHNvbiIpDQoNCiMjIyMjIyMjIyMjQm94cGxvdHMNCg0KIyNUaW1lDQoNCnZhcmlhYmxlIDwtIGMoIkRheXMiKQ0KDQphbHBoYS5tZXRyaWNzLnZpciA8LSBwbG90X3JpY2huZXNzKFBTQi5SLCBtZWFzdXJlcz1hbHBoYV9tZXQgLCB4PXZhcmlhYmxlLCBjb2xvcj12YXJpYWJsZSkgKyANCiAgZ2VvbV9ib3hwbG90KGFscGhhPTAuMSwgbHdkID0gMSkgKw0KICBzY2FsZV9jb2xvcl9qY28oKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgICAgICBheGlzLmxpbmU9ZWxlbWVudF9saW5lKHNpemU9MSksDQogICAgICAgIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZSA9IDgsIGNvbG91ciA9ICJCbGFjayIpLA0KICAgICAgICBheGlzLnRpY2tzPWVsZW1lbnRfbGluZShzaXplPTEsIGNvbG91ciA9ICJCbGFjayIpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJ3aGl0ZSIsIGZpbGwgPSAid2hpdGUiKSwNCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksDQogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgYW5nbGUgPSAwKSwNCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpDQogICkgKw0KICBsYWJzKHg9IkRheXMiLA0KICAgICAgIHk9IkFscGhhIGRpdmVyc2l0eSIpICArIA0KICBnZ3RpdGxlKCJWaXJvbWUiKSArDQogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwgMC4xNSkpKQ0KDQphbHBoYS5tZXRyaWNzLnZpcg0KYGBgDQoNCmBgYHtyLCBldmFsID0gRiwgaW5jbHVkZSA9IEYsIGVjaG8gPSBGLCB3YXJuaW5nID0gRn0NCiMjUmljaG5lc3MgLSBhbGwgdGltZSBwb2ludHMNCg0KcmljaG5lc3MgPSBlc3RpbWF0ZV9yaWNobmVzcyhQU0IuUiwgbWVhc3VyZXMgPSBhbHBoYV9tZXQpDQoNCiNUaW1lDQoNCnJpY2ggPC0gY2JpbmQocmljaG5lc3MsIHZhcmlhYmxlID0gc2FtcGxlX2RhdGEoUFNCLlIpJERheXMpDQoNClR1a2V5SFNEKGFvdihTaGFubm9uIH4gdmFyaWFibGUsIHJpY2gpKQ0KDQpgYGANCg0KIyMgQmFjdGVyaWFsIGFuZCB2aXJhbCBzaGFubm9uIGRpdmVyc2l0eQ0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgd2FybmluZz1GfQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI0FscGhhIGRpdmVyc2l0eSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojI05vcm1hbGl6ZSBib3RoIGJhY3RlcmlhbCBhbmQgdmlyYWwgZGF0YSB0byBtZWFuIHJlYWQgY291bnQNCg0KDQpzdGFuZGYgPSBmdW5jdGlvbih4LCB0PXRvdGFsKSByb3VuZCh0ICogKHggLyBzdW0oeCkpKQ0KI2JhY3RlcmlhDQp0b3RhbCA9IG1lZGlhbihzYW1wbGVfc3VtcyhQU0IpKQ0KUFNCUiA9IHRyYW5zZm9ybV9zYW1wbGVfY291bnRzKFBTQiwgc3RhbmRmKQ0KI3Zpcm9tZQ0KdG90YWwgPSBtZWRpYW4oc2FtcGxlX3N1bXMoUFNWKSkNClBTVlIgPSB0cmFuc2Zvcm1fc2FtcGxlX2NvdW50cyhQU1YsIHN0YW5kZikNCg0KI1NldCBkZXNpcmVkIGFscGhhIGRpdmVyc2l0eSBtZXRyaWNzDQoNCiNhbGhhX21ldCA8LSBjKCJPYnNlcnZlZCIsICJTaGFubm9uIiwiQ2hhbzEiLCJBQ0UiKQ0KDQphbGhhX21ldCA8LSBjKCJTaGFubm9uIikgDQoNCg0KIyMjIyMjIyMjIyNCb3hwbG90cw0KDQojU2V0IGRheXMgYXMgZmFjdG9yDQojIHNhbXBsZV9kYXRhKFBTQlIpJERheXMgPSBhcy5mYWN0b3Ioc2FtcGxlX2RhdGEoUFNCUikkRGF5cykNCiMgc2FtcGxlX2RhdGEoUFNWUikkRGF5cyA9IGFzLmZhY3RvcihzYW1wbGVfZGF0YShQU1ZSKSREYXlzKQ0KDQojU2V0IHNpZ24gYXJndW1ldG5zDQpzeW1udW0uYXJncyA8LSBsaXN0KGN1dHBvaW50cyA9IGMoMCwgMC4wMDAxLCAwLjAwMSwgMC4wMSwgMC4wNSwgMSksIHN5bWJvbHMgPSBjKCIqKioqIiwgIioqKiIsICIqKiIsICIqIiwgIm5zIikpDQoNCg0KI0JhY3RlcmlhDQoNCiNteV9jb21wYXJpc29ucyA9IGxpc3QoIGMoIjAiLCAiMTUiKSwgYygiMzAiLCAiOTAiKSwgYygiMCIsIjMwIiksIGMoIjAiLCI5MCIpLCBjKCIxNSIsIjkwIikgKSAjQWxsIGNvbXBhcmlzb25zDQpteV9jb21wYXJpc29ucyA9IGxpc3QoIGMoIjMwIiwgIjkwIiksIGMoIjEiLCIzMCIpLCBjKCIxIiwiOTAiKSwgYygiMTUiLCI5MCIpICkgIyNDaG9vc2UgY29tcGFyaXNvbnMgLSBoaWRlIG5vbiBzaWduIGNvbXBhcmlzb25zDQoNCg0KYmFjLmFscGhhIDwtIHBsb3RfcmljaG5lc3MoUFNCUiwgbWVhc3VyZXM9YWxoYV9tZXQgLCB4PSJEYXlzIiwgY29sb3I9IkRheXMiKSArIA0KICBnZW9tX2JveHBsb3QoYWxwaGE9MC4xKSArDQogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLCBtZXRob2QgPSAid2lsY294IiwgcGFpcmVkID0gRkFMU0UsIHN5bW51bS5hcmdzID0gc3ltbnVtLmFyZ3MpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIsaGp1c3QgPSAwLjUpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkNCiAgICAgICAgKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jb2xfZmlsKSArDQogIGxhYnMoeSA9ICJTaGFubm9uIGRpdmVyc2l0eSIpICsNCiAgZ2d0aXRsZSgiQmFjdGVyaWEiKQ0KDQojYmFjLmFscGhhDQoNCiNWaXJvbWUNCg0KI215X2NvbXBhcmlzb25zID0gbGlzdCggYygiMSIsICIxNSIpLCBjKCIzMCIsICI5MCIpLCBjKCIxIiwiMzAiKSwgYygiMSIsIjkwIiksIGMoIjE1IiwiOTAiKSApDQpteV9jb21wYXJpc29ucyA9IGxpc3QoIGMoIjEiLCAiMTUiKSApICNTaWduIGNvbXBhcmlzb25zIA0KDQp2aXIuYWxwaGEgPC0gcGxvdF9yaWNobmVzcyhQU1ZSLCBtZWFzdXJlcz1hbGhhX21ldCAsIHg9IkRheXMiLCBjb2xvcj0iRGF5cyIpICsgDQogIGdlb21fYm94cGxvdChhbHBoYT0wLjEpICsNCiAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsIG1ldGhvZCA9ICJ3aWxjb3giLCBwYWlyZWQgPSBGQUxTRSwgc3ltbnVtLmFyZ3MgPSBzeW1udW0uYXJncykgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIixoanVzdCA9IDAuNSksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKQ0KICApICsNCiAgZ2VvbV9wb2ludChzaXplID0gMikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWNvbF9maWwpICsNCiAgbGFicyh5ID0gIiIpICsNCiAgZ2d0aXRsZSgiVmlyb21lIikNCg0KdmlyLmFscGhhDQoNCmFscGhhX2RpdiA8LSBwbG90X2dyaWQoYmFjLmFscGhhLHZpci5hbHBoYSkNCg0KYGBgDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IEYsIGVjaG8gPSBGLCB3YXJuaW5nPUZ9DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjU3VwcGxlbWVudGFyeSAtIG11bHRpcGxlIG1lYXN1cmVzDQoNCiNTZXQgZGVzaXJlZCBhbHBoYSBkaXZlcnNpdHkgbWV0cmljcw0KDQphbGhhX21ldCA8LSBjKCJPYnNlcnZlZCIsIlNoYW5ub24iLCJJbnZTaW1wc29uIikNCg0KDQojIyMjIyMjIyMjI0JveHBsb3RzDQoNCiNTZXQgZGF5cyBhcyBmYWN0b3INCnNhbXBsZV9kYXRhKFBTQlIpJERheXMgPSBhcy5mYWN0b3Ioc2FtcGxlX2RhdGEoUFNCUikkRGF5cykNCnNhbXBsZV9kYXRhKFBTVlIpJERheXMgPSBhcy5mYWN0b3Ioc2FtcGxlX2RhdGEoUFNWUikkRGF5cykNCg0KI1NldCBzaWduIGFyZ3VtZXRucw0Kc3ltbnVtLmFyZ3MgPC0gbGlzdChjdXRwb2ludHMgPSBjKDAsIDAuMDAwMSwgMC4wMDEsIDAuMDEsIDAuMDUsIDEpLCBzeW1ib2xzID0gYygiKioqKiIsICIqKioiLCAiKioiLCAiKiIsICJucyIpKQ0KDQoNCiNCYWN0ZXJpYQ0KDQpteV9jb21wYXJpc29ucyA9IGxpc3QoIGMoIjEiLCAiMTUiKSwgYygiMzAiLCAiOTAiKSwgYygiMSIsIjMwIiksIGMoIjEiLCI5MCIpLCBjKCIxNSIsIjkwIikgKSAjQWxsIGNvbXBhcmlzb25zDQojbXlfY29tcGFyaXNvbnMgPSBsaXN0KGMoIjMwIiwgIjkwIiksYygiMTUiLCI5MCIpICkgIyNDaG9vc2UgY29tcGFyaXNvbnMgLSBoaWRlIG5vbiBzaWduIGNvbXBhcmlzb25zDQoNCg0KYmFjLmFscGhhLmFsbCA8LSBwbG90X3JpY2huZXNzKFBTQlIsIG1lYXN1cmVzPWFsaGFfbWV0ICwgeD0iRGF5cyIsIGNvbG9yPSJEYXlzIikgKyANCiAgZ2VvbV9ib3hwbG90KGFscGhhPTAuMSkgKw0KICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBteV9jb21wYXJpc29ucywgbWV0aG9kID0gIndpbGNveCIsIHBhaXJlZCA9IEZBTFNFLCBzeW1udW0uYXJncyA9IHN5bW51bS5hcmdzKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiLGhqdXN0ID0gMC41KSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKQ0KICApICsNCiAgZ2VvbV9wb2ludChzaXplID0gMikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWNvbF9maWwpICsNCiAgbGFicyh5ID0gIkFscGhhIGRpdmVyc2l0eSIpICsNCiAgZ2d0aXRsZSgiQmFjdGVyaWEiKQ0KDQojYmFjLmFscGhhLmFsbA0KDQojVmlyb21lDQoNCnZpci5hbHBoYS5hbGwgPC0gcGxvdF9yaWNobmVzcyhQU1ZSLCBtZWFzdXJlcz1hbGhhX21ldCAsIHg9IkRheXMiLCBjb2xvcj0iRGF5cyIpICsgDQogIGdlb21fYm94cGxvdChhbHBoYT0wLjEpICsNCiAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsIG1ldGhvZCA9ICJ3aWxjb3giLCBwYWlyZWQgPSBGQUxTRSwgc3ltbnVtLmFyZ3MgPSBzeW1udW0uYXJncykgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIixoanVzdCA9IDAuNSksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkNCiAgKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jb2xfZmlsKSArDQogIGxhYnMoeSA9ICIiKSArDQogIGdndGl0bGUoIlZpcm9tZSIpDQoNCiN2aXIuYWxwaGEuYWxsDQoNCnZpci5hbHBoYS5hbGwgPC0gcGxvdF9ncmlkKGJhYy5hbHBoYS5hbGwsdmlyLmFscGhhLmFsbCxsZWdlbmQ9RiwgbmNvbCA9IDEpDQpgYGANCg0KIyMgQmFjIHZzIHZpcmFsIGFsZmEgZGl2ZXJzaXR5DQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFR9DQojU3Vic2V0IHNhbXBsZXMgcHJlc2VudCBpbiBib3RoDQp2aXJfaWRzIDwtIFBTVkBzYW1fZGF0YSRkZXNjcmlwdGlvbiAlPiUgc3RyX3NwbGl0X2koIl8iLC0xKQ0KUFNWQHNhbV9kYXRhJGlkIDwtIHZpcl9pZHMNClBTQlJAc2FtX2RhdGEkZGVzY3JpcHRpb24gPC1QU0JSQHNhbV9kYXRhJGRlc2NyaXB0aW9uICU+JSBzdHJfc3BsaXRfaSgiXyIsLTEpDQpQU1ZSQHNhbV9kYXRhJGRlc2NyaXB0aW9uIDwtUFNWUkBzYW1fZGF0YSRkZXNjcmlwdGlvbiAlPiUgc3RyX3NwbGl0X2koIl8iLC0xKQ0KDQpQU0IuUi5ib3RoIDwtIHN1YnNldF9zYW1wbGVzKFBTQlIsZGVzY3JpcHRpb24gJWluJSB2aXJfaWRzKQ0KI1BTVi5DU1MuYm90aCA8LSBzdWJzZXRfc2FtcGxlcyhQU1YuQ1NTLHZpcl9pZHMgJWluJSBQU0IuQ1NTLmJvdGhAc2FtX2RhdGEkZGVzY3JpcHRpb24pDQpQU1YuUi5ib3RoIDwtIHN1YnNldF9zYW1wbGVzKFBTVlIsdmlyX2lkcyAlaW4lIFBTQi5SLmJvdGhAc2FtX2RhdGEkZGVzY3JpcHRpb24pDQoNCnNoYW5ub25fYmFjID0gZXN0aW1hdGVfcmljaG5lc3MoUFNCLlIuYm90aCwgbWVhc3VyZXMgPSAiU2hhbm5vbiIpDQpzaGFubm9uX2JhYyA8LSBjYmluZChzaGFubm9uX2JhYywgRGF5cyA9IHNhbXBsZV9kYXRhKFBTQi5SLmJvdGgpJERheXMpICU+JSBkcGx5cjo6cmVuYW1lKEJhY19TaGFubm9uID0gU2hhbm5vbikNCg0Kc2hhbm5vbl92aXIgPSBlc3RpbWF0ZV9yaWNobmVzcyhQU1YuUi5ib3RoLCBtZWFzdXJlcyA9ICJTaGFubm9uIikNCnNoYW5ub25fdmlyIDwtIGNiaW5kKHNoYW5ub25fdmlyLCBEYXlzID0gc2FtcGxlX2RhdGEoUFNWLlIuYm90aCkkRGF5cykgJT4lIGRwbHlyOjpyZW5hbWUoVmlyX1NoYW5ub24gPSBTaGFubm9uKQ0KDQpzaGFubm9uX2JhY192aXIgPC0gY2JpbmQoc2hhbm5vbl9iYWMsVmlyX1NoYW5ub249c2hhbm5vbl92aXIkVmlyX1NoYW5ub24pDQoNCmdncGxvdChzaGFubm9uX2JhY192aXIsYWVzKHg9QmFjX1NoYW5ub24seT1WaXJfU2hhbm5vbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgLGNvbG9yPURheXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkpKw0KICBnZW9tX3BvaW50KCkgDQogICMgZ3BtaXNjOjpzdGF0X3BvbHlfbGluZSgpICsNCiAgIyBnZ3BtaXNjOjpzdGF0X3BvbHlfZXEodXNlX2xhYmVsKGMoImVxIiwgIlIyIikpKSINCmBgYA0KDQoNCiMgQmV0YSBkaXZlcnNpdHkNCg0KIyMgRGF5cw0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQoNCiMjIyMjIyMjIyMjI1BhaXJ3aXNlIHBlcm1hbm92YSB0byBjYWxjdWxhdGUgc2lnbmlmaWNhbmNlDQoNCiMjQWRvbmlzDQoNCiNCYWN0ZXJpYQ0KYnJheS5QU0IgPC0gcGh5bG9zZXE6OmRpc3RhbmNlKFBTQi5DU1MsIG1ldGhvZCA9ICJicmF5IikNCg0KI21ha2UgYSBkYXRhIGZyYW1lIGZyb20gdGhlIHNhbXBsZV9kYXRhDQpzYW1wbGVkZi5QU0IgPC0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShQU0IuQ1NTKSkNCg0KYWRvbmlzLlBTQiA8LSBhZG9uaXMyKGJyYXkuUFNCIH4gRGF5cywgZGF0YSA9IHNhbXBsZWRmLlBTQikNCg0KDQojVmlyb21lDQpicmF5LlBTViA8LSBwaHlsb3NlcTo6ZGlzdGFuY2UoUFNWLkNTUywgbWV0aG9kID0gImJyYXkiKQ0KDQojIG1ha2UgYSBkYXRhIGZyYW1lIGZyb20gdGhlIHNhbXBsZV9kYXRhDQpzYW1wbGVkZi5QU1YgPC0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShQU1YuQ1NTKSkNCg0KYWRvbmlzLlBTViA8LSBhZG9uaXMyKGJyYXkuUFNWIH4gRGF5cywgZGF0YSA9IHNhbXBsZWRmLlBTVikNCg0KIyMjIyMjIyMgRG8gUENvQSBvcmRpbmF0aW9uIGJhc2VkIG9uIEJyYXktY3VydGlzIGRpc3RhbmNlDQoNCkdQLm9yZCA8LSBvcmRpbmF0ZShQU0IuQ1NTLCAiUENvQSIsICJicmF5IikNCg0KYmFjLmJldGEgPSBwbG90X29yZGluYXRpb24oUFNCLkNTUywgR1Aub3JkLCBjb2xvcj0iRGF5cyIpICsgDQogIHN0YXRfZWxsaXBzZShhZXMoY29sb3IgPSBEYXlzKSxnZW9tID0gInBvbHlnb24iLCBsZXZlbCA9IDAuOTUsIGZpbGwgPSBOQSwgc2l6ZSA9IDEpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPSBjb2xfZmlsKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xfZmlsKSArDQogIHRoZW1lX2NsYXNzaWMoKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIixoanVzdCA9IDAuNSksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKQ0KICApICsgDQogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBEYXlzKSwgY29sb3I9ICJibGFjayIgLHBjaD0yMSwgc2l6ZSA9IDMuNSkgKw0KICBzY2FsZV94X3JldmVyc2UoKSArIyBSZXZlcnQgeC1heGlzIHRvIG1hdGNoIHBsb3RzDQogIGdndGl0bGUoIkJhY3RlcmlhIikgKw0KZ2dwbG90Mjo6YW5ub3RhdGUoInRleHQiLCB4ID0gLTAuNDUsIHkgPSAwLjQsIGxhYmVsID0gIlAgPCAwLjAwMSIpICNBZGQgcC12YWx1ZSBmcm9tIGFkb25pcw0KDQojYmFjLmJldGEgDQoNCkdQLm9yZCA8LSBvcmRpbmF0ZShQU1YuQ1NTLCAiUENvQSIsICJicmF5IikNCg0KdmlyLmJldGEgPSBwbG90X29yZGluYXRpb24oUFNWLkNTUywgR1Aub3JkLCBjb2xvcj0iRGF5cyIpICsgDQogIHN0YXRfZWxsaXBzZShhZXMoY29sb3IgPSBEYXlzKSxnZW9tID0gInBvbHlnb24iLCBsZXZlbCA9IDAuOTUsIGZpbGwgPSBOQSwgc2l6ZSA9IDEpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPSBjb2xfZmlsKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xfZmlsKSArDQogIHRoZW1lX2NsYXNzaWMoKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIixoanVzdCA9IDAuNSksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKQ0KICApICsNCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IERheXMpLCBjb2xvcj0gImJsYWNrIiAscGNoPTIxLCBzaXplID0gMy41KSArDQogICNzY2FsZV95X3JldmVyc2UoKSArICMgUmV2ZXJ0IHktYXhpcyB0byBtYXRjaCBwbG90cw0KICBnZ3RpdGxlKCJWaXJvbWUiKSArDQogIGdncGxvdDI6OmFubm90YXRlKCJ0ZXh0IiwgeCA9IC0wLjYsIHkgPSAtMC41LCBsYWJlbCA9ICJQIDwgMC4wMDEiKSAjQWRkIHAtdmFsdWUgZnJvbSBhZG9uaXMNCg0KI3Zpci5iZXRhDQoNCiNBcnJhbmdlIHBsb3RzDQoNCnBsb3RfZ3JpZChiYWMuYmV0YSwgdmlyLmJldGEsIG5yb3cgPSAxKQ0KDQpgYGANCg0KTkIhIFRoaXMgaXMgaW5jbHVkaW5nIHNvbWUgYmFjdGVyaWFsIGRheSAwIHNhbXBsZXMgPjEwMCByZWFkcyENCg0KIyBXaXRoaW4gdnMgYmV0d2VlbiB0d2luIHBhaXJzIGJyYXkgY3VydGlzIGRpc3NpbWlsYXJpdHkNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGfQ0KDQpzb3VyY2UoIkhlbHBlcl9GdW5jdGlvbnMuUiIpDQoNCiMjIyMjIyMjIyMjIyNHZW5lcmF0ZSBCcmF5IGN1cnRpcyBwYWlyd2lzZSBkaXN0YW5jZSBkYXRhIGZyYW1lOg0KDQojUFNCLkNTUy5zdWIgPC0gc3Vic2V0X3NhbXBsZXMoUFNCLkNTUywgRGF5cyA9PSAiOTAiKSANCg0KIyBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIG9iamVjdA0KbWV0YWRhdGFTdG9vbCA8LSBkYXRhLmZyYW1lKHNhbXBsZV9kYXRhKFBTQi5DU1MpKQ0KDQp1bndlaWdodGVkRGlzdCA8LSBhcy5tYXRyaXgodChQU0IuQ1NTQG90dV90YWJsZSkpDQoNCnVud2VpZ2h0ZWREaXN0IDwtIHZlZ2Rpc3QodW53ZWlnaHRlZERpc3QsIGRpc3QgPSAiYnJheSIpDQoNCiMgQ29lcmNlIGRpc3RhbmNlIG9iamVjdCBpbnRvIG1hdHJpeA0KdW53ZWlnaHRlZERpc3RNdHggPC0gYXMubWF0cml4KHVud2VpZ2h0ZWREaXN0KQ0KDQojIE1lbHQgYW5kIHJlbW92ZSB2YWx1ZXMgb2YgMCB0byBlbGltaW5hdGUgZGlzdGFuY2VzIG9mIGVhY2ggc2FtcGxlIHRvIGl0c2VsZg0KdW53ZWlnaHRlZERpc3RNdHhfbWVsdCA8LSBzdWJzZXQocmVzaGFwZTI6Om1lbHQodW53ZWlnaHRlZERpc3RNdHgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICJVbmlGcmFjX0Rpc3RhbmNlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlGcmFjX0Rpc3RhbmNlICE9IDApDQoNCiMgQ2hhbmdlIFZhcjEgYW5kIFZhcjIgZnJvbSBmYWN0b3JzIHRvIGNoYXJhY3RlcnMgZm9yIGVhc2llciB1c2Ugd2l0aCBkcGx5cg0KZmFjdG9yQ29scyA8LSBjKCJWYXIxIiwgIlZhcjIiKQ0KdW53ZWlnaHRlZERpc3RNdHhfbWVsdFtmYWN0b3JDb2xzXSA8LSBsYXBwbHkodW53ZWlnaHRlZERpc3RNdHhfbWVsdFtmYWN0b3JDb2xzXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIpDQoNCiMgQWRkIGNvbHVtbnMgZm9yIGxhdGVyIHN1YnNldHRpbmcgd2hlbiBwbG90dGluZy4gIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBnZXQNCiMgICBwdWxsZWQgZnJvbSB0aGUgbWV0YWRhdGEgKG1ldGFkYXRhU3Rvb2wpLiAgV2l0aGluIHRoZSAqRGlzdE10eF9tZWx0IGRhdGEgDQojICAgZnJhbWVzLCB3ZSBuZWVkIGEgY29sdW1uIGluZGljYXRpbmcgd2hldGhlciBWYXIxIGFuZCBWYXIyIGFyZSBpbmZhbnRzLA0KIyAgIG1vdGhlcnMsIGFuZCB3aGV0aGVyIHRoZXkncmUgcmVsYXRlZC4NCnVud2VpZ2h0ZWREaXN0REYgPC0gdW53ZWlnaHRlZERpc3RNdHhfbWVsdA0KDQojIEFkZCBWYXIxIGFuZCBWYXIyIFR5cGUgYW5kIFp5Z29zaXR5IGNvbHVtbnMNCiMgUHV0IHJvd25hbWVzIGJhY2sgaW4gbWV0YWRhdGFTdG9vbCwgdGhlbiB1c2UgdGhlIHJvd25hbWVzIHRvIGxvY2F0ZSBuZWVkZWQgaW5mbw0KIyA8LSBjb2x1bW5fdG9fcm93bmFtZXMobWV0YWRhdGFTdG9vbCwgdmFyID0gIlR3aW5fcGFpcnMiKQ0KDQp1bndlaWdodGVkRGlzdERGIDwtIHVud2VpZ2h0ZWREaXN0REYgJT4lDQogIG11dGF0ZShWYXIxX1R5cGUgPSBtZXRhZGF0YVN0b29sW3Vud2VpZ2h0ZWREaXN0REYkVmFyMSwgIlR3aW5fcGFpcnMiXSwNCiAgICAgICAgIFZhcjJfVHlwZSA9IG1ldGFkYXRhU3Rvb2xbdW53ZWlnaHRlZERpc3RERiRWYXIyLCAiVHdpbl9wYWlycyJdKQ0KDQojIFRvIGVhc2lseSBkZXRlcm1pbmUgdGhlIHJlbGF0ZWRuZXNzIG9mIHRoZSBwYWlyZWQgc2FtcGxlcyBpbiBlYWNoIHJvdywNCiMgICBjcmVhdGUgInNob3J0IG5hbWVzIiB0byByZXBsYWNlIHRoZSBsb25nIHNhbXBsZSBuYW1lcy4NCiMgICBGaXJzdCBwdXQgdGhlIHJvd25hbWVzIGJhY2sgaW50byBhIGNvbHVtbi4NCg0KbWV0YWRhdGFTdG9vbCA8LSByb3duYW1lc190b19jb2x1bW4obWV0YWRhdGFTdG9vbCwgdmFyID0gIlNhbXBsZSIpDQoNCmx1dF9kZiA8LSBkcGx5cjo6c2VsZWN0KG1ldGFkYXRhU3Rvb2wsIFNhbXBsZSwgVHdpbl9wYWlycywgVHdpbl9wYWlycykNCg0KIyBjb252ZXJ0IGx1dF9kZiBpbnRvIGEgdmVjdG9yDQpsdXQgPC0gYXMuY2hhcmFjdGVyKGx1dF9kZiRUd2luX3BhaXJzKQ0KbmFtZXMobHV0KSA8LSBsdXRfZGYkU2FtcGxlDQoNCiMgQWRkIGluIHRoZSBzaG9ydCBuYW1lcyB0byB0aGUgZGlzdGFuY2UgZGF0YSBmcmFtZXMNCnVud2VpZ2h0ZWREaXN0REYkVmFyMV9TaG9ydE5hbWUgPC0gbHV0W3Vud2VpZ2h0ZWREaXN0REYkVmFyMV0NCnVud2VpZ2h0ZWREaXN0REYkVmFyMl9TaG9ydE5hbWUgPC0gbHV0W3Vud2VpZ2h0ZWREaXN0REYkVmFyMl0NCg0KIyBBZGQgYSBjb2x1bW4gaW5kaWNhdGluZyB3aGV0aGVyIGEgZ2l2ZW4gcm93IChwYWlyd2lzZSBjb21wYXJpc29uKSBpcyBiZXR3ZWVuDQojICAgdHdvIHJlbGF0ZWQgb3IgdW5yZWxhdGVkIHNhbXBsZXMuDQojICAgTG9vcCBvdmVyIHRoZSByb3dzIG9mIHRoZSBkaXN0YW5jZSBkZiwgc3BsaXQgVmFyMSBhbmQgVmFyMiBzaG9ydCBuYW1lcyBieSANCiMgICAiLiIgZGVsaW1pdGVyIGFuZCBjb21wYXJlIHRoZSAybmQgZWxlbWVudCBvZiB0aGUgcmVzdWx0aW5nIGxpc3Qgd2hpY2ggd2lsbCBob2xkIHRoZSANCiMgICBUYXJyIEZhbWlseSBJRCwNCg0KQWRkUGFpclJlbGF0aW9uIDwtIGZ1bmN0aW9uKGRmKSB7DQogIA0KICBvbGRERiA8LSBkZg0KICANCiAgcGFpclJlbGF0aW9uIDwtIHZlY3Rvcihtb2RlID0gImNoYXJhY3RlciIsIGxlbmd0aCA9IG5yb3cob2xkREYpKQ0KICANCiAgZm9yIChpIGluIDE6bnJvdyhvbGRERikpIHsNCiAgICBWYXIxX3NwbGl0IDwtIHN0cnNwbGl0KHggPSBkZltpLCAiVmFyMV9TaG9ydE5hbWUiXSwgc3BsaXQgPSAiXFwuIikNCiAgICBWYXIyX3NwbGl0IDwtIHN0cnNwbGl0KHggPSBkZltpLCAiVmFyMl9TaG9ydE5hbWUiXSwgc3BsaXQgPSAiXFwuIikNCiAgICANCiAgICBpZiAoVmFyMV9zcGxpdFtbMV1dW1sxXV0gPT0gVmFyMl9zcGxpdFtbMV1dW1sxXV0pIHsNCiAgICAgIHBhaXJSZWxhdGlvbltpXSA8LSAiQmV0d2VlbiBcbiB0d2lucyINCiAgICB9IGVsc2Ugew0KICAgICAgcGFpclJlbGF0aW9uW2ldIDwtICJCZXR3ZWVuIFxuIHVucmVsYXRlZCINCiAgICB9DQogIH0NCiAgDQogIG9sZERGJFBhaXJfUmVsYXRpb24gPC0gcGFpclJlbGF0aW9uDQogIA0KICByZXR1cm4ob2xkREYpDQogIA0KfQ0KDQp1bndlaWdodGVkRGlzdERGIDwtIEFkZFBhaXJSZWxhdGlvbih1bndlaWdodGVkRGlzdERGKQ0KDQojV2VpZ2h0ZWQgZGlzdGFuY2UgYm94cGxvdHMNCg0KQnJheVBsb3QuYmFjIDwtIA0KICANCiAgZ2dwbG90KHVud2VpZ2h0ZWREaXN0REYsYWVzKFBhaXJfUmVsYXRpb24sVW5pRnJhY19EaXN0YW5jZSxmaWxsID0gUGFpcl9SZWxhdGlvbikpICsNCiAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsID0gUGFpcl9SZWxhdGlvbiksb3V0bGllci5zaGFwZT1OQSkrDQogICMgIGdlb21faml0dGVyKHdpZHRoID0gMC4yKSArDQogIHlsYWIoIkJyYXktY3VydGlzIGRpc3RhbmNlIikgKw0KICB4bGFiKCJCYWN0ZXJpYSIpICsNCiAgdGhlbWVfcHViY2xlYW4oKSArDQogIHNjYWxlX2ZpbGxfamNvKCkgKw0KICBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0IiAsbGFiZWwueC5ucGMgPSAwLjUpDQoNCiNCcmF5UGxvdC5iYWMNCmBgYA0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KDQpzb3VyY2UoIkhlbHBlcl9GdW5jdGlvbnMuUiIpDQoNCiMjIyMjIyMjIyMjIyNHZW5lcmF0ZSBCcmF5IGN1cnRpcyBwYWlyd2lzZSBkaXN0YW5jZSBkYXRhIGZyYW1lOg0KDQojIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2Ugb2JqZWN0DQptZXRhZGF0YVN0b29sIDwtIGRhdGEuZnJhbWUoc2FtcGxlX2RhdGEoUFNWLkNTUykpDQoNCnVud2VpZ2h0ZWREaXN0IDwtIGFzLm1hdHJpeCh0KFBTVi5DU1NAb3R1X3RhYmxlKSkNCg0KdW53ZWlnaHRlZERpc3QgPC0gdmVnZGlzdCh1bndlaWdodGVkRGlzdCwgZGlzdCA9ICJicmF5IikNCg0KIyBDb2VyY2UgZGlzdGFuY2Ugb2JqZWN0IGludG8gbWF0cml4DQp1bndlaWdodGVkRGlzdE10eCA8LSBhcy5tYXRyaXgodW53ZWlnaHRlZERpc3QpDQoNCiMgTWVsdCBhbmQgcmVtb3ZlIHZhbHVlcyBvZiAwIHRvIGVsaW1pbmF0ZSBkaXN0YW5jZXMgb2YgZWFjaCBzYW1wbGUgdG8gaXRzZWxmDQp1bndlaWdodGVkRGlzdE10eF9tZWx0IDwtIHN1YnNldChyZXNoYXBlMjo6bWVsdCh1bndlaWdodGVkRGlzdE10eCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gIlVuaUZyYWNfRGlzdGFuY2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaUZyYWNfRGlzdGFuY2UgIT0gMCkNCg0KIyBDaGFuZ2UgVmFyMSBhbmQgVmFyMiBmcm9tIGZhY3RvcnMgdG8gY2hhcmFjdGVycyBmb3IgZWFzaWVyIHVzZSB3aXRoIGRwbHlyDQpmYWN0b3JDb2xzIDwtIGMoIlZhcjEiLCAiVmFyMiIpDQp1bndlaWdodGVkRGlzdE10eF9tZWx0W2ZhY3RvckNvbHNdIDwtIGxhcHBseSh1bndlaWdodGVkRGlzdE10eF9tZWx0W2ZhY3RvckNvbHNdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3RlcikNCg0KIyBBZGQgY29sdW1ucyBmb3IgbGF0ZXIgc3Vic2V0dGluZyB3aGVuIHBsb3R0aW5nLiAgVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGdldA0KIyAgIHB1bGxlZCBmcm9tIHRoZSBtZXRhZGF0YSAobWV0YWRhdGFTdG9vbCkuICBXaXRoaW4gdGhlICpEaXN0TXR4X21lbHQgZGF0YSANCiMgICBmcmFtZXMsIHdlIG5lZWQgYSBjb2x1bW4gaW5kaWNhdGluZyB3aGV0aGVyIFZhcjEgYW5kIFZhcjIgYXJlIGluZmFudHMsDQojICAgbW90aGVycywgYW5kIHdoZXRoZXIgdGhleSdyZSByZWxhdGVkLg0KdW53ZWlnaHRlZERpc3RERiA8LSB1bndlaWdodGVkRGlzdE10eF9tZWx0DQoNCiMgQWRkIFZhcjEgYW5kIFZhcjIgVHlwZSBhbmQgWnlnb3NpdHkgY29sdW1ucw0KIyBQdXQgcm93bmFtZXMgYmFjayBpbiBtZXRhZGF0YVN0b29sLCB0aGVuIHVzZSB0aGUgcm93bmFtZXMgdG8gbG9jYXRlIG5lZWRlZCBpbmZvDQojIDwtIGNvbHVtbl90b19yb3duYW1lcyhtZXRhZGF0YVN0b29sLCB2YXIgPSAiVHdpbl9wYWlycyIpDQoNCnVud2VpZ2h0ZWREaXN0REYgPC0gdW53ZWlnaHRlZERpc3RERiAlPiUNCiAgbXV0YXRlKFZhcjFfVHlwZSA9IG1ldGFkYXRhU3Rvb2xbdW53ZWlnaHRlZERpc3RERiRWYXIxLCAiVHdpbl9wYWlycyJdLA0KICAgICAgICAgVmFyMl9UeXBlID0gbWV0YWRhdGFTdG9vbFt1bndlaWdodGVkRGlzdERGJFZhcjIsICJUd2luX3BhaXJzIl0pDQoNCiMgVG8gZWFzaWx5IGRldGVybWluZSB0aGUgcmVsYXRlZG5lc3Mgb2YgdGhlIHBhaXJlZCBzYW1wbGVzIGluIGVhY2ggcm93LA0KIyAgIGNyZWF0ZSAic2hvcnQgbmFtZXMiIHRvIHJlcGxhY2UgdGhlIGxvbmcgc2FtcGxlIG5hbWVzLg0KIyAgIEZpcnN0IHB1dCB0aGUgcm93bmFtZXMgYmFjayBpbnRvIGEgY29sdW1uLg0KDQptZXRhZGF0YVN0b29sIDwtIHJvd25hbWVzX3RvX2NvbHVtbihtZXRhZGF0YVN0b29sLCB2YXIgPSAiU2FtcGxlIikNCg0KbHV0X2RmIDwtIGRwbHlyOjpzZWxlY3QobWV0YWRhdGFTdG9vbCwgU2FtcGxlLCBUd2luX3BhaXJzLCBUd2luX3BhaXJzKQ0KDQojIGNvbnZlcnQgbHV0X2RmIGludG8gYSB2ZWN0b3INCmx1dCA8LSBhcy5jaGFyYWN0ZXIobHV0X2RmJFR3aW5fcGFpcnMpDQpuYW1lcyhsdXQpIDwtIGx1dF9kZiRTYW1wbGUNCg0KIyBBZGQgaW4gdGhlIHNob3J0IG5hbWVzIHRvIHRoZSBkaXN0YW5jZSBkYXRhIGZyYW1lcw0KdW53ZWlnaHRlZERpc3RERiRWYXIxX1Nob3J0TmFtZSA8LSBsdXRbdW53ZWlnaHRlZERpc3RERiRWYXIxXQ0KdW53ZWlnaHRlZERpc3RERiRWYXIyX1Nob3J0TmFtZSA8LSBsdXRbdW53ZWlnaHRlZERpc3RERiRWYXIyXQ0KDQojIEFkZCBhIGNvbHVtbiBpbmRpY2F0aW5nIHdoZXRoZXIgYSBnaXZlbiByb3cgKHBhaXJ3aXNlIGNvbXBhcmlzb24pIGlzIGJldHdlZW4NCiMgICB0d28gcmVsYXRlZCBvciB1bnJlbGF0ZWQgc2FtcGxlcy4NCiMgICBMb29wIG92ZXIgdGhlIHJvd3Mgb2YgdGhlIGRpc3RhbmNlIGRmLCBzcGxpdCBWYXIxIGFuZCBWYXIyIHNob3J0IG5hbWVzIGJ5IA0KIyAgICIuIiBkZWxpbWl0ZXIgYW5kIGNvbXBhcmUgdGhlIDJuZCBlbGVtZW50IG9mIHRoZSByZXN1bHRpbmcgbGlzdCB3aGljaCB3aWxsIGhvbGQgdGhlIA0KIyAgIFRhcnIgRmFtaWx5IElELA0KDQpBZGRQYWlyUmVsYXRpb24gPC0gZnVuY3Rpb24oZGYpIHsNCiAgDQogIG9sZERGIDwtIGRmDQogIA0KICBwYWlyUmVsYXRpb24gPC0gdmVjdG9yKG1vZGUgPSAiY2hhcmFjdGVyIiwgbGVuZ3RoID0gbnJvdyhvbGRERikpDQogIA0KICBmb3IgKGkgaW4gMTpucm93KG9sZERGKSkgew0KICAgIFZhcjFfc3BsaXQgPC0gc3Ryc3BsaXQoeCA9IGRmW2ksICJWYXIxX1Nob3J0TmFtZSJdLCBzcGxpdCA9ICJcXC4iKQ0KICAgIFZhcjJfc3BsaXQgPC0gc3Ryc3BsaXQoeCA9IGRmW2ksICJWYXIyX1Nob3J0TmFtZSJdLCBzcGxpdCA9ICJcXC4iKQ0KICAgIA0KICAgIGlmIChWYXIxX3NwbGl0W1sxXV1bWzFdXSA9PSBWYXIyX3NwbGl0W1sxXV1bWzFdXSkgew0KICAgICAgcGFpclJlbGF0aW9uW2ldIDwtICJCZXR3ZWVuIFxuIHR3aW5zIg0KICAgIH0gZWxzZSB7DQogICAgICBwYWlyUmVsYXRpb25baV0gPC0gIkJldHdlZW4gXG4gdW5yZWxhdGVkIg0KICAgIH0NCiAgfQ0KICANCiAgb2xkREYkUGFpcl9SZWxhdGlvbiA8LSBwYWlyUmVsYXRpb24NCiAgDQogIHJldHVybihvbGRERikNCiAgDQp9DQoNCnVud2VpZ2h0ZWREaXN0REYgPC0gQWRkUGFpclJlbGF0aW9uKHVud2VpZ2h0ZWREaXN0REYpDQoNCiNXZWlnaHRlZCBkaXN0YW5jZSBib3hwbG90cw0KDQpCcmF5UGxvdC52aXIgPC0gDQogIA0KICBnZ3Bsb3QodW53ZWlnaHRlZERpc3RERixhZXMoUGFpcl9SZWxhdGlvbixVbmlGcmFjX0Rpc3RhbmNlLGZpbGwgPSBQYWlyX1JlbGF0aW9uKSkgKw0KICBnZW9tX2JveHBsb3QoYWVzKGZpbGwgPSBQYWlyX1JlbGF0aW9uKSxvdXRsaWVyLnNoYXBlPU5BKSsNCiAgIyAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICsNCiAgeWxhYigiQnJheS1jdXJ0aXMgZGlzdGFuY2UiKSArDQogIHhsYWIoIlZpcm9tZSIpICsNCiAgdGhlbWVfcHViY2xlYW4oKSArDQogIHNjYWxlX2ZpbGxfamNvKCkgKw0KICBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0IiAsbGFiZWwueC5ucGMgPSAwLjUpDQoNCiNCcmF5UGxvdC52aXINCg0KcGxvdF9ncmlkKEJyYXlQbG90LmJhYyxCcmF5UGxvdC52aXIsIG5yb3cgPSAxKQ0KYGBgDQoNCiMjIEluZGl2aWR1YWwgdGltZSBwb2ludHMNCg0KIyMjIERheSAxDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQpzb3VyY2UoIkhlbHBlcl9GdW5jdGlvbnMuUiIpDQoNClBTQi5DU1Muc3ViIDwtIHN1YnNldF9zYW1wbGVzKFBTQi5DU1MsIERheXMgPT0gIjEiKSANCg0KUFNWLkNTUy5zdWIgPC0gc3Vic2V0X3NhbXBsZXMoUFNWLkNTUywgRGF5cyA9PSAiMSIpIA0KDQojIyMjIyMjIyMjIyMjR2VuZXJhdGUgQnJheSBjdXJ0aXMgcGFpcndpc2UgZGlzdGFuY2UgZGF0YSBmcmFtZToNCg0KIyBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIG9iamVjdA0KbWV0YWRhdGFTdG9vbCA8LSBkYXRhLmZyYW1lKHNhbXBsZV9kYXRhKFBTQi5DU1Muc3ViKSkNCg0KdW53ZWlnaHRlZERpc3QgPC0gYXMubWF0cml4KHQoUFNCLkNTUy5zdWJAb3R1X3RhYmxlKSkNCg0KdW53ZWlnaHRlZERpc3QgPC0gdmVnZGlzdCh1bndlaWdodGVkRGlzdCwgZGlzdCA9ICJicmF5IikNCg0KIyBDb2VyY2UgZGlzdGFuY2Ugb2JqZWN0IGludG8gbWF0cml4DQp1bndlaWdodGVkRGlzdE10eCA8LSBhcy5tYXRyaXgodW53ZWlnaHRlZERpc3QpDQoNCiMgTWVsdCBhbmQgcmVtb3ZlIHZhbHVlcyBvZiAwIHRvIGVsaW1pbmF0ZSBkaXN0YW5jZXMgb2YgZWFjaCBzYW1wbGUgdG8gaXRzZWxmDQp1bndlaWdodGVkRGlzdE10eF9tZWx0IDwtIHN1YnNldChyZXNoYXBlMjo6bWVsdCh1bndlaWdodGVkRGlzdE10eCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gIlVuaUZyYWNfRGlzdGFuY2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaUZyYWNfRGlzdGFuY2UgIT0gMCkNCg0KIyBDaGFuZ2UgVmFyMSBhbmQgVmFyMiBmcm9tIGZhY3RvcnMgdG8gY2hhcmFjdGVycyBmb3IgZWFzaWVyIHVzZSB3aXRoIGRwbHlyDQpmYWN0b3JDb2xzIDwtIGMoIlZhcjEiLCAiVmFyMiIpDQp1bndlaWdodGVkRGlzdE10eF9tZWx0W2ZhY3RvckNvbHNdIDwtIGxhcHBseSh1bndlaWdodGVkRGlzdE10eF9tZWx0W2ZhY3RvckNvbHNdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3RlcikNCg0KIyBBZGQgY29sdW1ucyBmb3IgbGF0ZXIgc3Vic2V0dGluZyB3aGVuIHBsb3R0aW5nLiAgVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGdldA0KIyAgIHB1bGxlZCBmcm9tIHRoZSBtZXRhZGF0YSAobWV0YWRhdGFTdG9vbCkuICBXaXRoaW4gdGhlICpEaXN0TXR4X21lbHQgZGF0YSANCiMgICBmcmFtZXMsIHdlIG5lZWQgYSBjb2x1bW4gaW5kaWNhdGluZyB3aGV0aGVyIFZhcjEgYW5kIFZhcjIgYXJlIGluZmFudHMsDQojICAgbW90aGVycywgYW5kIHdoZXRoZXIgdGhleSdyZSByZWxhdGVkLg0KdW53ZWlnaHRlZERpc3RERiA8LSB1bndlaWdodGVkRGlzdE10eF9tZWx0DQoNCiMgQWRkIFZhcjEgYW5kIFZhcjIgVHlwZSBhbmQgWnlnb3NpdHkgY29sdW1ucw0KIyBQdXQgcm93bmFtZXMgYmFjayBpbiBtZXRhZGF0YVN0b29sLCB0aGVuIHVzZSB0aGUgcm93bmFtZXMgdG8gbG9jYXRlIG5lZWRlZCBpbmZvDQojIDwtIGNvbHVtbl90b19yb3duYW1lcyhtZXRhZGF0YVN0b29sLCB2YXIgPSAiVHdpbl9wYWlycyIpDQoNCnVud2VpZ2h0ZWREaXN0REYgPC0gdW53ZWlnaHRlZERpc3RERiAlPiUNCiAgbXV0YXRlKFZhcjFfVHlwZSA9IG1ldGFkYXRhU3Rvb2xbdW53ZWlnaHRlZERpc3RERiRWYXIxLCAiVHdpbl9wYWlycyJdLA0KICAgICAgICAgVmFyMl9UeXBlID0gbWV0YWRhdGFTdG9vbFt1bndlaWdodGVkRGlzdERGJFZhcjIsICJUd2luX3BhaXJzIl0pDQoNCiMgVG8gZWFzaWx5IGRldGVybWluZSB0aGUgcmVsYXRlZG5lc3Mgb2YgdGhlIHBhaXJlZCBzYW1wbGVzIGluIGVhY2ggcm93LA0KIyAgIGNyZWF0ZSAic2hvcnQgbmFtZXMiIHRvIHJlcGxhY2UgdGhlIGxvbmcgc2FtcGxlIG5hbWVzLg0KIyAgIEZpcnN0IHB1dCB0aGUgcm93bmFtZXMgYmFjayBpbnRvIGEgY29sdW1uLg0KDQptZXRhZGF0YVN0b29sIDwtIHJvd25hbWVzX3RvX2NvbHVtbihtZXRhZGF0YVN0b29sLCB2YXIgPSAiU2FtcGxlIikNCg0KbHV0X2RmIDwtIGRwbHlyOjpzZWxlY3QobWV0YWRhdGFTdG9vbCwgU2FtcGxlLCBUd2luX3BhaXJzLCBUd2luX3BhaXJzKQ0KDQojIGNvbnZlcnQgbHV0X2RmIGludG8gYSB2ZWN0b3INCmx1dCA8LSBhcy5jaGFyYWN0ZXIobHV0X2RmJFR3aW5fcGFpcnMpDQpuYW1lcyhsdXQpIDwtIGx1dF9kZiRTYW1wbGUNCg0KIyBBZGQgaW4gdGhlIHNob3J0IG5hbWVzIHRvIHRoZSBkaXN0YW5jZSBkYXRhIGZyYW1lcw0KdW53ZWlnaHRlZERpc3RERiRWYXIxX1Nob3J0TmFtZSA8LSBsdXRbdW53ZWlnaHRlZERpc3RERiRWYXIxXQ0KdW53ZWlnaHRlZERpc3RERiRWYXIyX1Nob3J0TmFtZSA8LSBsdXRbdW53ZWlnaHRlZERpc3RERiRWYXIyXQ0KDQojIEFkZCBhIGNvbHVtbiBpbmRpY2F0aW5nIHdoZXRoZXIgYSBnaXZlbiByb3cgKHBhaXJ3aXNlIGNvbXBhcmlzb24pIGlzIGJldHdlZW4NCiMgICB0d28gcmVsYXRlZCBvciB1bnJlbGF0ZWQgc2FtcGxlcy4NCiMgICBMb29wIG92ZXIgdGhlIHJvd3Mgb2YgdGhlIGRpc3RhbmNlIGRmLCBzcGxpdCBWYXIxIGFuZCBWYXIyIHNob3J0IG5hbWVzIGJ5IA0KIyAgICIuIiBkZWxpbWl0ZXIgYW5kIGNvbXBhcmUgdGhlIDJuZCBlbGVtZW50IG9mIHRoZSByZXN1bHRpbmcgbGlzdCB3aGljaCB3aWxsIGhvbGQgdGhlIA0KIyAgIFRhcnIgRmFtaWx5IElELA0KDQpBZGRQYWlyUmVsYXRpb24gPC0gZnVuY3Rpb24oZGYpIHsNCiAgDQogIG9sZERGIDwtIGRmDQogIA0KICBwYWlyUmVsYXRpb24gPC0gdmVjdG9yKG1vZGUgPSAiY2hhcmFjdGVyIiwgbGVuZ3RoID0gbnJvdyhvbGRERikpDQogIA0KICBmb3IgKGkgaW4gMTpucm93KG9sZERGKSkgew0KICAgIFZhcjFfc3BsaXQgPC0gc3Ryc3BsaXQoeCA9IGRmW2ksICJWYXIxX1Nob3J0TmFtZSJdLCBzcGxpdCA9ICJcXC4iKQ0KICAgIFZhcjJfc3BsaXQgPC0gc3Ryc3BsaXQoeCA9IGRmW2ksICJWYXIyX1Nob3J0TmFtZSJdLCBzcGxpdCA9ICJcXC4iKQ0KICAgIA0KICAgIGlmIChWYXIxX3NwbGl0W1sxXV1bWzFdXSA9PSBWYXIyX3NwbGl0W1sxXV1bWzFdXSkgew0KICAgICAgcGFpclJlbGF0aW9uW2ldIDwtICJCZXR3ZWVuIFxuIHR3aW5zIg0KICAgIH0gZWxzZSB7DQogICAgICBwYWlyUmVsYXRpb25baV0gPC0gIkJldHdlZW4gXG4gdW5yZWxhdGVkIg0KICAgIH0NCiAgfQ0KICANCiAgb2xkREYkUGFpcl9SZWxhdGlvbiA8LSBwYWlyUmVsYXRpb24NCiAgDQogIHJldHVybihvbGRERikNCiAgDQp9DQoNCnVud2VpZ2h0ZWREaXN0REYgPC0gQWRkUGFpclJlbGF0aW9uKHVud2VpZ2h0ZWREaXN0REYpDQoNCiNXZWlnaHRlZCBkaXN0YW5jZSBib3hwbG90cw0KDQpCcmF5UGxvdC5iYWMuMCA8LSANCiAgDQogIGdncGxvdCh1bndlaWdodGVkRGlzdERGLGFlcyhQYWlyX1JlbGF0aW9uLFVuaUZyYWNfRGlzdGFuY2UsZmlsbCA9IFBhaXJfUmVsYXRpb24pKSArDQogIGdlb21fYm94cGxvdChhZXMoZmlsbCA9IFBhaXJfUmVsYXRpb24pLG91dGxpZXIuc2hhcGU9TkEpKw0KICAjICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgKw0KICB5bGFiKCJCcmF5LWN1cnRpcyBkaXN0YW5jZSIpICsNCiAgeGxhYigiRGF5IDAiKSArDQogIHRoZW1lX3B1YmNsZWFuKCkgKw0KICBzY2FsZV9maWxsX2pjbygpICsNCiAgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIgLGFlcyhsYWJlbCA9IHBhc3RlMCgicCA9ICIsIC4ucC5mb3JtYXQuLikpLGxhYmVsLngubnBjPSJjZW50ZXIiLGxhYmVsLnk9MC42NSkgKw0KICBndWlkZXMoZmlsbD0ibm9uZSIpDQoNCiNCcmF5UGxvdC5iYWMNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNWaXJvbWUNCg0KIyMjIyMjIyMjIyMjI0dlbmVyYXRlIEJyYXkgY3VydGlzIHBhaXJ3aXNlIGRpc3RhbmNlIGRhdGEgZnJhbWU6DQoNCiMgQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBvYmplY3QNCm1ldGFkYXRhU3Rvb2wgPC0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShQU1YuQ1NTLnN1YikpDQoNCnVud2VpZ2h0ZWREaXN0IDwtIGFzLm1hdHJpeCh0KFBTVi5DU1Muc3ViQG90dV90YWJsZSkpDQoNCnVud2VpZ2h0ZWREaXN0IDwtIHZlZ2Rpc3QodW53ZWlnaHRlZERpc3QsIGRpc3QgPSAiYnJheSIpDQoNCiMgQ29lcmNlIGRpc3RhbmNlIG9iamVjdCBpbnRvIG1hdHJpeA0KdW53ZWlnaHRlZERpc3RNdHggPC0gYXMubWF0cml4KHVud2VpZ2h0ZWREaXN0KQ0KDQojIE1lbHQgYW5kIHJlbW92ZSB2YWx1ZXMgb2YgMCB0byBlbGltaW5hdGUgZGlzdGFuY2VzIG9mIGVhY2ggc2FtcGxlIHRvIGl0c2VsZg0KdW53ZWlnaHRlZERpc3RNdHhfbWVsdCA8LSBzdWJzZXQocmVzaGFwZTI6Om1lbHQodW53ZWlnaHRlZERpc3RNdHgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICJVbmlGcmFjX0Rpc3RhbmNlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlGcmFjX0Rpc3RhbmNlICE9IDApDQoNCiMgQ2hhbmdlIFZhcjEgYW5kIFZhcjIgZnJvbSBmYWN0b3JzIHRvIGNoYXJhY3RlcnMgZm9yIGVhc2llciB1c2Ugd2l0aCBkcGx5cg0KZmFjdG9yQ29scyA8LSBjKCJWYXIxIiwgIlZhcjIiKQ0KdW53ZWlnaHRlZERpc3RNdHhfbWVsdFtmYWN0b3JDb2xzXSA8LSBsYXBwbHkodW53ZWlnaHRlZERpc3RNdHhfbWVsdFtmYWN0b3JDb2xzXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIpDQoNCiMgQWRkIGNvbHVtbnMgZm9yIGxhdGVyIHN1YnNldHRpbmcgd2hlbiBwbG90dGluZy4gIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBnZXQNCiMgICBwdWxsZWQgZnJvbSB0aGUgbWV0YWRhdGEgKG1ldGFkYXRhU3Rvb2wpLiAgV2l0aGluIHRoZSAqRGlzdE10eF9tZWx0IGRhdGEgDQojICAgZnJhbWVzLCB3ZSBuZWVkIGEgY29sdW1uIGluZGljYXRpbmcgd2hldGhlciBWYXIxIGFuZCBWYXIyIGFyZSBpbmZhbnRzLA0KIyAgIG1vdGhlcnMsIGFuZCB3aGV0aGVyIHRoZXkncmUgcmVsYXRlZC4NCnVud2VpZ2h0ZWREaXN0REYgPC0gdW53ZWlnaHRlZERpc3RNdHhfbWVsdA0KDQojIEFkZCBWYXIxIGFuZCBWYXIyIFR5cGUgYW5kIFp5Z29zaXR5IGNvbHVtbnMNCiMgUHV0IHJvd25hbWVzIGJhY2sgaW4gbWV0YWRhdGFTdG9vbCwgdGhlbiB1c2UgdGhlIHJvd25hbWVzIHRvIGxvY2F0ZSBuZWVkZWQgaW5mbw0KIyA8LSBjb2x1bW5fdG9fcm93bmFtZXMobWV0YWRhdGFTdG9vbCwgdmFyID0gIlR3aW5fcGFpcnMiKQ0KDQp1bndlaWdodGVkRGlzdERGIDwtIHVud2VpZ2h0ZWREaXN0REYgJT4lDQogIG11dGF0ZShWYXIxX1R5cGUgPSBtZXRhZGF0YVN0b29sW3Vud2VpZ2h0ZWREaXN0REYkVmFyMSwgIlR3aW5fcGFpcnMiXSwNCiAgICAgICAgIFZhcjJfVHlwZSA9IG1ldGFkYXRhU3Rvb2xbdW53ZWlnaHRlZERpc3RERiRWYXIyLCAiVHdpbl9wYWlycyJdKQ0KDQojIFRvIGVhc2lseSBkZXRlcm1pbmUgdGhlIHJlbGF0ZWRuZXNzIG9mIHRoZSBwYWlyZWQgc2FtcGxlcyBpbiBlYWNoIHJvdywNCiMgICBjcmVhdGUgInNob3J0IG5hbWVzIiB0byByZXBsYWNlIHRoZSBsb25nIHNhbXBsZSBuYW1lcy4NCiMgICBGaXJzdCBwdXQgdGhlIHJvd25hbWVzIGJhY2sgaW50byBhIGNvbHVtbi4NCg0KbWV0YWRhdGFTdG9vbCA8LSByb3duYW1lc190b19jb2x1bW4obWV0YWRhdGFTdG9vbCwgdmFyID0gIlNhbXBsZSIpDQoNCmx1dF9kZiA8LSBkcGx5cjo6c2VsZWN0KG1ldGFkYXRhU3Rvb2wsIFNhbXBsZSwgVHdpbl9wYWlycywgVHdpbl9wYWlycykNCg0KIyBjb252ZXJ0IGx1dF9kZiBpbnRvIGEgdmVjdG9yDQpsdXQgPC0gYXMuY2hhcmFjdGVyKGx1dF9kZiRUd2luX3BhaXJzKQ0KbmFtZXMobHV0KSA8LSBsdXRfZGYkU2FtcGxlDQoNCiMgQWRkIGluIHRoZSBzaG9ydCBuYW1lcyB0byB0aGUgZGlzdGFuY2UgZGF0YSBmcmFtZXMNCnVud2VpZ2h0ZWREaXN0REYkVmFyMV9TaG9ydE5hbWUgPC0gbHV0W3Vud2VpZ2h0ZWREaXN0REYkVmFyMV0NCnVud2VpZ2h0ZWREaXN0REYkVmFyMl9TaG9ydE5hbWUgPC0gbHV0W3Vud2VpZ2h0ZWREaXN0REYkVmFyMl0NCg0KIyBBZGQgYSBjb2x1bW4gaW5kaWNhdGluZyB3aGV0aGVyIGEgZ2l2ZW4gcm93IChwYWlyd2lzZSBjb21wYXJpc29uKSBpcyBiZXR3ZWVuDQojICAgdHdvIHJlbGF0ZWQgb3IgdW5yZWxhdGVkIHNhbXBsZXMuDQojICAgTG9vcCBvdmVyIHRoZSByb3dzIG9mIHRoZSBkaXN0YW5jZSBkZiwgc3BsaXQgVmFyMSBhbmQgVmFyMiBzaG9ydCBuYW1lcyBieSANCiMgICAiLiIgZGVsaW1pdGVyIGFuZCBjb21wYXJlIHRoZSAybmQgZWxlbWVudCBvZiB0aGUgcmVzdWx0aW5nIGxpc3Qgd2hpY2ggd2lsbCBob2xkIHRoZSANCiMgICBUYXJyIEZhbWlseSBJRCwNCg0KQWRkUGFpclJlbGF0aW9uIDwtIGZ1bmN0aW9uKGRmKSB7DQogIA0KICBvbGRERiA8LSBkZg0KICANCiAgcGFpclJlbGF0aW9uIDwtIHZlY3Rvcihtb2RlID0gImNoYXJhY3RlciIsIGxlbmd0aCA9IG5yb3cob2xkREYpKQ0KICANCiAgZm9yIChpIGluIDE6bnJvdyhvbGRERikpIHsNCiAgICBWYXIxX3NwbGl0IDwtIHN0cnNwbGl0KHggPSBkZltpLCAiVmFyMV9TaG9ydE5hbWUiXSwgc3BsaXQgPSAiXFwuIikNCiAgICBWYXIyX3NwbGl0IDwtIHN0cnNwbGl0KHggPSBkZltpLCAiVmFyMl9TaG9ydE5hbWUiXSwgc3BsaXQgPSAiXFwuIikNCiAgICANCiAgICBpZiAoVmFyMV9zcGxpdFtbMV1dW1sxXV0gPT0gVmFyMl9zcGxpdFtbMV1dW1sxXV0pIHsNCiAgICAgIHBhaXJSZWxhdGlvbltpXSA8LSAiQmV0d2VlbiBcbiB0d2lucyINCiAgICB9IGVsc2Ugew0KICAgICAgcGFpclJlbGF0aW9uW2ldIDwtICJCZXR3ZWVuIFxuIHVucmVsYXRlZCINCiAgICB9DQogIH0NCiAgDQogIG9sZERGJFBhaXJfUmVsYXRpb24gPC0gcGFpclJlbGF0aW9uDQogIA0KICByZXR1cm4ob2xkREYpDQogIA0KfQ0KDQp1bndlaWdodGVkRGlzdERGIDwtIEFkZFBhaXJSZWxhdGlvbih1bndlaWdodGVkRGlzdERGKQ0KDQojV2VpZ2h0ZWQgZGlzdGFuY2UgYm94cGxvdHMNCg0KbXlfY29tcGFyaXNvbnMgPC0gbGlzdChjKCJSZWxhdGVkIiwiVW5yZWxhdGVkIikpDQoNCkJyYXlQbG90LnZpci4wIDwtIA0KICANCiAgZ2dwbG90KHVud2VpZ2h0ZWREaXN0REYsYWVzKFBhaXJfUmVsYXRpb24sVW5pRnJhY19EaXN0YW5jZSxmaWxsID0gUGFpcl9SZWxhdGlvbikpICsNCiAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsID0gUGFpcl9SZWxhdGlvbiksb3V0bGllci5zaGFwZT1OQSkrDQogICMgIGdlb21faml0dGVyKHdpZHRoID0gMC4yKSArDQogIHlsYWIoIkJyYXktY3VydGlzIGRpc3RhbmNlIikgKw0KICB4bGFiKCJEYXkgMCIpICsNCiAgdGhlbWVfcHViY2xlYW4oKSArDQogIHNjYWxlX2ZpbGxfamNvKCkgKw0KICBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0IiAsYWVzKGxhYmVsID0gcGFzdGUwKCJwID0gIiwgLi5wLmZvcm1hdC4uKSksbGFiZWwueC5ucGM9ImNlbnRlciIsbGFiZWwueT0wLjY1KSArDQogIGd1aWRlcyhmaWxsPSJub25lIikNCg0KDQojQnJheVBsb3QudmlyDQoNCnBsb3RfZ3JpZChCcmF5UGxvdC5iYWMuMCxCcmF5UGxvdC52aXIuMCwgbnJvdyA9IDEpDQpgYGANCg0KIyMjIERheSAxNQ0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0Kc291cmNlKCJIZWxwZXJfRnVuY3Rpb25zLlIiKQ0KDQpQU0IuQ1NTLnN1YiA8LSBzdWJzZXRfc2FtcGxlcyhQU0IuQ1NTLCBEYXlzID09ICIxNSIpIA0KDQpQU1YuQ1NTLnN1YiA8LSBzdWJzZXRfc2FtcGxlcyhQU1YuQ1NTLCBEYXlzID09ICIxNSIpIA0KDQojIyMjIyMjIyMjIyMjR2VuZXJhdGUgQnJheSBjdXJ0aXMgcGFpcndpc2UgZGlzdGFuY2UgZGF0YSBmcmFtZToNCg0KIyBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIG9iamVjdA0KbWV0YWRhdGFTdG9vbCA8LSBkYXRhLmZyYW1lKHNhbXBsZV9kYXRhKFBTQi5DU1Muc3ViKSkNCg0KdW53ZWlnaHRlZERpc3QgPC0gYXMubWF0cml4KHQoUFNCLkNTUy5zdWJAb3R1X3RhYmxlKSkNCg0KdW53ZWlnaHRlZERpc3QgPC0gdmVnZGlzdCh1bndlaWdodGVkRGlzdCwgZGlzdCA9ICJicmF5IikNCg0KIyBDb2VyY2UgZGlzdGFuY2Ugb2JqZWN0IGludG8gbWF0cml4DQp1bndlaWdodGVkRGlzdE10eCA8LSBhcy5tYXRyaXgodW53ZWlnaHRlZERpc3QpDQoNCiMgTWVsdCBhbmQgcmVtb3ZlIHZhbHVlcyBvZiAwIHRvIGVsaW1pbmF0ZSBkaXN0YW5jZXMgb2YgZWFjaCBzYW1wbGUgdG8gaXRzZWxmDQp1bndlaWdodGVkRGlzdE10eF9tZWx0IDwtIHN1YnNldChyZXNoYXBlMjo6bWVsdCh1bndlaWdodGVkRGlzdE10eCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gIlVuaUZyYWNfRGlzdGFuY2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaUZyYWNfRGlzdGFuY2UgIT0gMCkNCg0KIyBDaGFuZ2UgVmFyMSBhbmQgVmFyMiBmcm9tIGZhY3RvcnMgdG8gY2hhcmFjdGVycyBmb3IgZWFzaWVyIHVzZSB3aXRoIGRwbHlyDQpmYWN0b3JDb2xzIDwtIGMoIlZhcjEiLCAiVmFyMiIpDQp1bndlaWdodGVkRGlzdE10eF9tZWx0W2ZhY3RvckNvbHNdIDwtIGxhcHBseSh1bndlaWdodGVkRGlzdE10eF9tZWx0W2ZhY3RvckNvbHNdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3RlcikNCg0KIyBBZGQgY29sdW1ucyBmb3IgbGF0ZXIgc3Vic2V0dGluZyB3aGVuIHBsb3R0aW5nLiAgVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGdldA0KIyAgIHB1bGxlZCBmcm9tIHRoZSBtZXRhZGF0YSAobWV0YWRhdGFTdG9vbCkuICBXaXRoaW4gdGhlICpEaXN0TXR4X21lbHQgZGF0YSANCiMgICBmcmFtZXMsIHdlIG5lZWQgYSBjb2x1bW4gaW5kaWNhdGluZyB3aGV0aGVyIFZhcjEgYW5kIFZhcjIgYXJlIGluZmFudHMsDQojICAgbW90aGVycywgYW5kIHdoZXRoZXIgdGhleSdyZSByZWxhdGVkLg0KdW53ZWlnaHRlZERpc3RERiA8LSB1bndlaWdodGVkRGlzdE10eF9tZWx0DQoNCiMgQWRkIFZhcjEgYW5kIFZhcjIgVHlwZSBhbmQgWnlnb3NpdHkgY29sdW1ucw0KIyBQdXQgcm93bmFtZXMgYmFjayBpbiBtZXRhZGF0YVN0b29sLCB0aGVuIHVzZSB0aGUgcm93bmFtZXMgdG8gbG9jYXRlIG5lZWRlZCBpbmZvDQojIDwtIGNvbHVtbl90b19yb3duYW1lcyhtZXRhZGF0YVN0b29sLCB2YXIgPSAiVHdpbl9wYWlycyIpDQoNCnVud2VpZ2h0ZWREaXN0REYgPC0gdW53ZWlnaHRlZERpc3RERiAlPiUNCiAgbXV0YXRlKFZhcjFfVHlwZSA9IG1ldGFkYXRhU3Rvb2xbdW53ZWlnaHRlZERpc3RERiRWYXIxLCAiVHdpbl9wYWlycyJdLA0KICAgICAgICAgVmFyMl9UeXBlID0gbWV0YWRhdGFTdG9vbFt1bndlaWdodGVkRGlzdERGJFZhcjIsICJUd2luX3BhaXJzIl0pDQoNCiMgVG8gZWFzaWx5IGRldGVybWluZSB0aGUgcmVsYXRlZG5lc3Mgb2YgdGhlIHBhaXJlZCBzYW1wbGVzIGluIGVhY2ggcm93LA0KIyAgIGNyZWF0ZSAic2hvcnQgbmFtZXMiIHRvIHJlcGxhY2UgdGhlIGxvbmcgc2FtcGxlIG5hbWVzLg0KIyAgIEZpcnN0IHB1dCB0aGUgcm93bmFtZXMgYmFjayBpbnRvIGEgY29sdW1uLg0KDQptZXRhZGF0YVN0b29sIDwtIHJvd25hbWVzX3RvX2NvbHVtbihtZXRhZGF0YVN0b29sLCB2YXIgPSAiU2FtcGxlIikNCg0KbHV0X2RmIDwtIGRwbHlyOjpzZWxlY3QobWV0YWRhdGFTdG9vbCwgU2FtcGxlLCBUd2luX3BhaXJzLCBUd2luX3BhaXJzKQ0KDQojIGNvbnZlcnQgbHV0X2RmIGludG8gYSB2ZWN0b3INCmx1dCA8LSBhcy5jaGFyYWN0ZXIobHV0X2RmJFR3aW5fcGFpcnMpDQpuYW1lcyhsdXQpIDwtIGx1dF9kZiRTYW1wbGUNCg0KIyBBZGQgaW4gdGhlIHNob3J0IG5hbWVzIHRvIHRoZSBkaXN0YW5jZSBkYXRhIGZyYW1lcw0KdW53ZWlnaHRlZERpc3RERiRWYXIxX1Nob3J0TmFtZSA8LSBsdXRbdW53ZWlnaHRlZERpc3RERiRWYXIxXQ0KdW53ZWlnaHRlZERpc3RERiRWYXIyX1Nob3J0TmFtZSA8LSBsdXRbdW53ZWlnaHRlZERpc3RERiRWYXIyXQ0KDQojIEFkZCBhIGNvbHVtbiBpbmRpY2F0aW5nIHdoZXRoZXIgYSBnaXZlbiByb3cgKHBhaXJ3aXNlIGNvbXBhcmlzb24pIGlzIGJldHdlZW4NCiMgICB0d28gcmVsYXRlZCBvciB1bnJlbGF0ZWQgc2FtcGxlcy4NCiMgICBMb29wIG92ZXIgdGhlIHJvd3Mgb2YgdGhlIGRpc3RhbmNlIGRmLCBzcGxpdCBWYXIxIGFuZCBWYXIyIHNob3J0IG5hbWVzIGJ5IA0KIyAgICIuIiBkZWxpbWl0ZXIgYW5kIGNvbXBhcmUgdGhlIDJuZCBlbGVtZW50IG9mIHRoZSByZXN1bHRpbmcgbGlzdCB3aGljaCB3aWxsIGhvbGQgdGhlIA0KIyAgIFRhcnIgRmFtaWx5IElELA0KDQpBZGRQYWlyUmVsYXRpb24gPC0gZnVuY3Rpb24oZGYpIHsNCiAgDQogIG9sZERGIDwtIGRmDQogIA0KICBwYWlyUmVsYXRpb24gPC0gdmVjdG9yKG1vZGUgPSAiY2hhcmFjdGVyIiwgbGVuZ3RoID0gbnJvdyhvbGRERikpDQogIA0KICBmb3IgKGkgaW4gMTpucm93KG9sZERGKSkgew0KICAgIFZhcjFfc3BsaXQgPC0gc3Ryc3BsaXQoeCA9IGRmW2ksICJWYXIxX1Nob3J0TmFtZSJdLCBzcGxpdCA9ICJcXC4iKQ0KICAgIFZhcjJfc3BsaXQgPC0gc3Ryc3BsaXQoeCA9IGRmW2ksICJWYXIyX1Nob3J0TmFtZSJdLCBzcGxpdCA9ICJcXC4iKQ0KICAgIA0KICAgIGlmIChWYXIxX3NwbGl0W1sxXV1bWzFdXSA9PSBWYXIyX3NwbGl0W1sxXV1bWzFdXSkgew0KICAgICAgcGFpclJlbGF0aW9uW2ldIDwtICJCZXR3ZWVuIFxuIHR3aW5zIg0KICAgIH0gZWxzZSB7DQogICAgICBwYWlyUmVsYXRpb25baV0gPC0gIkJldHdlZW4gXG4gdW5yZWxhdGVkIg0KICAgIH0NCiAgfQ0KICANCiAgb2xkREYkUGFpcl9SZWxhdGlvbiA8LSBwYWlyUmVsYXRpb24NCiAgDQogIHJldHVybihvbGRERikNCiAgDQp9DQoNCnVud2VpZ2h0ZWREaXN0REYgPC0gQWRkUGFpclJlbGF0aW9uKHVud2VpZ2h0ZWREaXN0REYpDQoNCiNXZWlnaHRlZCBkaXN0YW5jZSBib3hwbG90cw0KDQpCcmF5UGxvdC5iYWMuMTUgPC0gDQogIA0KICBnZ3Bsb3QodW53ZWlnaHRlZERpc3RERixhZXMoUGFpcl9SZWxhdGlvbixVbmlGcmFjX0Rpc3RhbmNlLGZpbGwgPSBQYWlyX1JlbGF0aW9uKSkgKw0KICBnZW9tX2JveHBsb3QoYWVzKGZpbGwgPSBQYWlyX1JlbGF0aW9uKSxvdXRsaWVyLnNoYXBlPU5BKSsNCiAgIyAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICsNCiAgeWxhYigiQnJheS1jdXJ0aXMgZGlzdGFuY2UiKSArDQogIHhsYWIoIkRheSAxNSIpICsNCiAgdGhlbWVfcHViY2xlYW4oKSArDQogIHNjYWxlX2ZpbGxfamNvKCkgKw0KICBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0IiAsYWVzKGxhYmVsID0gcGFzdGUwKCJwID0gIiwgLi5wLmZvcm1hdC4uKSksbGFiZWwueC5ucGM9ImNlbnRlciIsbGFiZWwueT0wLjYpICsNCiAgZ3VpZGVzKGZpbGw9Im5vbmUiKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkNCiAgDQoNCiNCcmF5UGxvdC5iYWMNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNWaXJvbWUNCg0KIyMjIyMjIyMjIyMjI0dlbmVyYXRlIEJyYXkgY3VydGlzIHBhaXJ3aXNlIGRpc3RhbmNlIGRhdGEgZnJhbWU6DQoNCiMgQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBvYmplY3QNCm1ldGFkYXRhU3Rvb2wgPC0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShQU1YuQ1NTLnN1YikpDQoNCnVud2VpZ2h0ZWREaXN0IDwtIGFzLm1hdHJpeCh0KFBTVi5DU1Muc3ViQG90dV90YWJsZSkpDQoNCnVud2VpZ2h0ZWREaXN0IDwtIHZlZ2Rpc3QodW53ZWlnaHRlZERpc3QsIGRpc3QgPSAiYnJheSIpDQoNCiMgQ29lcmNlIGRpc3RhbmNlIG9iamVjdCBpbnRvIG1hdHJpeA0KdW53ZWlnaHRlZERpc3RNdHggPC0gYXMubWF0cml4KHVud2VpZ2h0ZWREaXN0KQ0KDQojIE1lbHQgYW5kIHJlbW92ZSB2YWx1ZXMgb2YgMCB0byBlbGltaW5hdGUgZGlzdGFuY2VzIG9mIGVhY2ggc2FtcGxlIHRvIGl0c2VsZg0KdW53ZWlnaHRlZERpc3RNdHhfbWVsdCA8LSBzdWJzZXQocmVzaGFwZTI6Om1lbHQodW53ZWlnaHRlZERpc3RNdHgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICJVbmlGcmFjX0Rpc3RhbmNlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlGcmFjX0Rpc3RhbmNlICE9IDApDQoNCiMgQ2hhbmdlIFZhcjEgYW5kIFZhcjIgZnJvbSBmYWN0b3JzIHRvIGNoYXJhY3RlcnMgZm9yIGVhc2llciB1c2Ugd2l0aCBkcGx5cg0KZmFjdG9yQ29scyA8LSBjKCJWYXIxIiwgIlZhcjIiKQ0KdW53ZWlnaHRlZERpc3RNdHhfbWVsdFtmYWN0b3JDb2xzXSA8LSBsYXBwbHkodW53ZWlnaHRlZERpc3RNdHhfbWVsdFtmYWN0b3JDb2xzXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIpDQoNCiMgQWRkIGNvbHVtbnMgZm9yIGxhdGVyIHN1YnNldHRpbmcgd2hlbiBwbG90dGluZy4gIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBnZXQNCiMgICBwdWxsZWQgZnJvbSB0aGUgbWV0YWRhdGEgKG1ldGFkYXRhU3Rvb2wpLiAgV2l0aGluIHRoZSAqRGlzdE10eF9tZWx0IGRhdGEgDQojICAgZnJhbWVzLCB3ZSBuZWVkIGEgY29sdW1uIGluZGljYXRpbmcgd2hldGhlciBWYXIxIGFuZCBWYXIyIGFyZSBpbmZhbnRzLA0KIyAgIG1vdGhlcnMsIGFuZCB3aGV0aGVyIHRoZXkncmUgcmVsYXRlZC4NCnVud2VpZ2h0ZWREaXN0REYgPC0gdW53ZWlnaHRlZERpc3RNdHhfbWVsdA0KDQojIEFkZCBWYXIxIGFuZCBWYXIyIFR5cGUgYW5kIFp5Z29zaXR5IGNvbHVtbnMNCiMgUHV0IHJvd25hbWVzIGJhY2sgaW4gbWV0YWRhdGFTdG9vbCwgdGhlbiB1c2UgdGhlIHJvd25hbWVzIHRvIGxvY2F0ZSBuZWVkZWQgaW5mbw0KIyA8LSBjb2x1bW5fdG9fcm93bmFtZXMobWV0YWRhdGFTdG9vbCwgdmFyID0gIlR3aW5fcGFpcnMiKQ0KDQp1bndlaWdodGVkRGlzdERGIDwtIHVud2VpZ2h0ZWREaXN0REYgJT4lDQogIG11dGF0ZShWYXIxX1R5cGUgPSBtZXRhZGF0YVN0b29sW3Vud2VpZ2h0ZWREaXN0REYkVmFyMSwgIlR3aW5fcGFpcnMiXSwNCiAgICAgICAgIFZhcjJfVHlwZSA9IG1ldGFkYXRhU3Rvb2xbdW53ZWlnaHRlZERpc3RERiRWYXIyLCAiVHdpbl9wYWlycyJdKQ0KDQojIFRvIGVhc2lseSBkZXRlcm1pbmUgdGhlIHJlbGF0ZWRuZXNzIG9mIHRoZSBwYWlyZWQgc2FtcGxlcyBpbiBlYWNoIHJvdywNCiMgICBjcmVhdGUgInNob3J0IG5hbWVzIiB0byByZXBsYWNlIHRoZSBsb25nIHNhbXBsZSBuYW1lcy4NCiMgICBGaXJzdCBwdXQgdGhlIHJvd25hbWVzIGJhY2sgaW50byBhIGNvbHVtbi4NCg0KbWV0YWRhdGFTdG9vbCA8LSByb3duYW1lc190b19jb2x1bW4obWV0YWRhdGFTdG9vbCwgdmFyID0gIlNhbXBsZSIpDQoNCmx1dF9kZiA8LSBkcGx5cjo6c2VsZWN0KG1ldGFkYXRhU3Rvb2wsIFNhbXBsZSwgVHdpbl9wYWlycywgVHdpbl9wYWlycykNCg0KIyBjb252ZXJ0IGx1dF9kZiBpbnRvIGEgdmVjdG9yDQpsdXQgPC0gYXMuY2hhcmFjdGVyKGx1dF9kZiRUd2luX3BhaXJzKQ0KbmFtZXMobHV0KSA8LSBsdXRfZGYkU2FtcGxlDQoNCiMgQWRkIGluIHRoZSBzaG9ydCBuYW1lcyB0byB0aGUgZGlzdGFuY2UgZGF0YSBmcmFtZXMNCnVud2VpZ2h0ZWREaXN0REYkVmFyMV9TaG9ydE5hbWUgPC0gbHV0W3Vud2VpZ2h0ZWREaXN0REYkVmFyMV0NCnVud2VpZ2h0ZWREaXN0REYkVmFyMl9TaG9ydE5hbWUgPC0gbHV0W3Vud2VpZ2h0ZWREaXN0REYkVmFyMl0NCg0KIyBBZGQgYSBjb2x1bW4gaW5kaWNhdGluZyB3aGV0aGVyIGEgZ2l2ZW4gcm93IChwYWlyd2lzZSBjb21wYXJpc29uKSBpcyBiZXR3ZWVuDQojICAgdHdvIHJlbGF0ZWQgb3IgdW5yZWxhdGVkIHNhbXBsZXMuDQojICAgTG9vcCBvdmVyIHRoZSByb3dzIG9mIHRoZSBkaXN0YW5jZSBkZiwgc3BsaXQgVmFyMSBhbmQgVmFyMiBzaG9ydCBuYW1lcyBieSANCiMgICAiLiIgZGVsaW1pdGVyIGFuZCBjb21wYXJlIHRoZSAybmQgZWxlbWVudCBvZiB0aGUgcmVzdWx0aW5nIGxpc3Qgd2hpY2ggd2lsbCBob2xkIHRoZSANCiMgICBUYXJyIEZhbWlseSBJRCwNCg0KQWRkUGFpclJlbGF0aW9uIDwtIGZ1bmN0aW9uKGRmKSB7DQogIA0KICBvbGRERiA8LSBkZg0KICANCiAgcGFpclJlbGF0aW9uIDwtIHZlY3Rvcihtb2RlID0gImNoYXJhY3RlciIsIGxlbmd0aCA9IG5yb3cob2xkREYpKQ0KICANCiAgZm9yIChpIGluIDE6bnJvdyhvbGRERikpIHsNCiAgICBWYXIxX3NwbGl0IDwtIHN0cnNwbGl0KHggPSBkZltpLCAiVmFyMV9TaG9ydE5hbWUiXSwgc3BsaXQgPSAiXFwuIikNCiAgICBWYXIyX3NwbGl0IDwtIHN0cnNwbGl0KHggPSBkZltpLCAiVmFyMl9TaG9ydE5hbWUiXSwgc3BsaXQgPSAiXFwuIikNCiAgICANCiAgICBpZiAoVmFyMV9zcGxpdFtbMV1dW1sxXV0gPT0gVmFyMl9zcGxpdFtbMV1dW1sxXV0pIHsNCiAgICAgIHBhaXJSZWxhdGlvbltpXSA8LSAiQmV0d2VlbiBcbiB0d2lucyINCiAgICB9IGVsc2Ugew0KICAgICAgcGFpclJlbGF0aW9uW2ldIDwtICJCZXR3ZWVuIFxuIHVucmVsYXRlZCINCiAgICB9DQogIH0NCiAgDQogIG9sZERGJFBhaXJfUmVsYXRpb24gPC0gcGFpclJlbGF0aW9uDQogIA0KICByZXR1cm4ob2xkREYpDQogIA0KfQ0KDQp1bndlaWdodGVkRGlzdERGIDwtIEFkZFBhaXJSZWxhdGlvbih1bndlaWdodGVkRGlzdERGKQ0KDQojV2VpZ2h0ZWQgZGlzdGFuY2UgYm94cGxvdHMNCg0KQnJheVBsb3QudmlyLjE1IDwtIA0KICANCiAgZ2dwbG90KHVud2VpZ2h0ZWREaXN0REYsYWVzKFBhaXJfUmVsYXRpb24sVW5pRnJhY19EaXN0YW5jZSxmaWxsID0gUGFpcl9SZWxhdGlvbikpICsNCiAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsID0gUGFpcl9SZWxhdGlvbiksb3V0bGllci5zaGFwZT1OQSkrDQogICMgIGdlb21faml0dGVyKHdpZHRoID0gMC4yKSArDQogIHlsYWIoIkJyYXktY3VydGlzIGRpc3RhbmNlIikgKw0KICB4bGFiKCJEYXkgMTUiKSArDQogIHRoZW1lX3B1YmNsZWFuKCkgKw0KICBzY2FsZV9maWxsX2pjbygpICsNCiAgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIgLGFlcyhsYWJlbCA9IHBhc3RlMCgicCA9ICIsIC4ucC5mb3JtYXQuLikpLGxhYmVsLngubnBjPSJjZW50ZXIiLGxhYmVsLnk9MC42KSArDQogIGd1aWRlcyhmaWxsPSJub25lIikgKw0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpDQoNCiNCcmF5UGxvdC52aXINCg0KcGxvdF9ncmlkKEJyYXlQbG90LmJhYy4xNSxCcmF5UGxvdC52aXIuMTUsIG5yb3cgPSAxKSArDQogIGd1aWRlcyhmaWxsPSJub25lIikNCmBgYA0KDQojIyMgRGF5IDMwDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQpzb3VyY2UoIkhlbHBlcl9GdW5jdGlvbnMuUiIpDQoNClBTQi5DU1Muc3ViIDwtIHN1YnNldF9zYW1wbGVzKFBTQi5DU1MsIERheXMgPT0gIjMwIikgDQoNClBTVi5DU1Muc3ViIDwtIHN1YnNldF9zYW1wbGVzKFBTVi5DU1MsIERheXMgPT0gIjMwIikgDQoNCiMjIyMjIyMjIyMjIyNHZW5lcmF0ZSBCcmF5IGN1cnRpcyBwYWlyd2lzZSBkaXN0YW5jZSBkYXRhIGZyYW1lOg0KDQojIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2Ugb2JqZWN0DQptZXRhZGF0YVN0b29sIDwtIGRhdGEuZnJhbWUoc2FtcGxlX2RhdGEoUFNCLkNTUy5zdWIpKQ0KDQp1bndlaWdodGVkRGlzdCA8LSBhcy5tYXRyaXgodChQU0IuQ1NTLnN1YkBvdHVfdGFibGUpKQ0KDQp1bndlaWdodGVkRGlzdCA8LSB2ZWdkaXN0KHVud2VpZ2h0ZWREaXN0LCBkaXN0ID0gImJyYXkiKQ0KDQojIENvZXJjZSBkaXN0YW5jZSBvYmplY3QgaW50byBtYXRyaXgNCnVud2VpZ2h0ZWREaXN0TXR4IDwtIGFzLm1hdHJpeCh1bndlaWdodGVkRGlzdCkNCg0KIyBNZWx0IGFuZCByZW1vdmUgdmFsdWVzIG9mIDAgdG8gZWxpbWluYXRlIGRpc3RhbmNlcyBvZiBlYWNoIHNhbXBsZSB0byBpdHNlbGYNCnVud2VpZ2h0ZWREaXN0TXR4X21lbHQgPC0gc3Vic2V0KHJlc2hhcGUyOjptZWx0KHVud2VpZ2h0ZWREaXN0TXR4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLm5hbWUgPSAiVW5pRnJhY19EaXN0YW5jZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pRnJhY19EaXN0YW5jZSAhPSAwKQ0KDQojIENoYW5nZSBWYXIxIGFuZCBWYXIyIGZyb20gZmFjdG9ycyB0byBjaGFyYWN0ZXJzIGZvciBlYXNpZXIgdXNlIHdpdGggZHBseXINCmZhY3RvckNvbHMgPC0gYygiVmFyMSIsICJWYXIyIikNCnVud2VpZ2h0ZWREaXN0TXR4X21lbHRbZmFjdG9yQ29sc10gPC0gbGFwcGx5KHVud2VpZ2h0ZWREaXN0TXR4X21lbHRbZmFjdG9yQ29sc10sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKQ0KDQojIEFkZCBjb2x1bW5zIGZvciBsYXRlciBzdWJzZXR0aW5nIHdoZW4gcGxvdHRpbmcuICBUaGlzIGluZm9ybWF0aW9uIHdpbGwgZ2V0DQojICAgcHVsbGVkIGZyb20gdGhlIG1ldGFkYXRhIChtZXRhZGF0YVN0b29sKS4gIFdpdGhpbiB0aGUgKkRpc3RNdHhfbWVsdCBkYXRhIA0KIyAgIGZyYW1lcywgd2UgbmVlZCBhIGNvbHVtbiBpbmRpY2F0aW5nIHdoZXRoZXIgVmFyMSBhbmQgVmFyMiBhcmUgaW5mYW50cywNCiMgICBtb3RoZXJzLCBhbmQgd2hldGhlciB0aGV5J3JlIHJlbGF0ZWQuDQp1bndlaWdodGVkRGlzdERGIDwtIHVud2VpZ2h0ZWREaXN0TXR4X21lbHQNCg0KIyBBZGQgVmFyMSBhbmQgVmFyMiBUeXBlIGFuZCBaeWdvc2l0eSBjb2x1bW5zDQojIFB1dCByb3duYW1lcyBiYWNrIGluIG1ldGFkYXRhU3Rvb2wsIHRoZW4gdXNlIHRoZSByb3duYW1lcyB0byBsb2NhdGUgbmVlZGVkIGluZm8NCiMgPC0gY29sdW1uX3RvX3Jvd25hbWVzKG1ldGFkYXRhU3Rvb2wsIHZhciA9ICJUd2luX3BhaXJzIikNCg0KdW53ZWlnaHRlZERpc3RERiA8LSB1bndlaWdodGVkRGlzdERGICU+JQ0KICBtdXRhdGUoVmFyMV9UeXBlID0gbWV0YWRhdGFTdG9vbFt1bndlaWdodGVkRGlzdERGJFZhcjEsICJUd2luX3BhaXJzIl0sDQogICAgICAgICBWYXIyX1R5cGUgPSBtZXRhZGF0YVN0b29sW3Vud2VpZ2h0ZWREaXN0REYkVmFyMiwgIlR3aW5fcGFpcnMiXSkNCg0KIyBUbyBlYXNpbHkgZGV0ZXJtaW5lIHRoZSByZWxhdGVkbmVzcyBvZiB0aGUgcGFpcmVkIHNhbXBsZXMgaW4gZWFjaCByb3csDQojICAgY3JlYXRlICJzaG9ydCBuYW1lcyIgdG8gcmVwbGFjZSB0aGUgbG9uZyBzYW1wbGUgbmFtZXMuDQojICAgRmlyc3QgcHV0IHRoZSByb3duYW1lcyBiYWNrIGludG8gYSBjb2x1bW4uDQoNCm1ldGFkYXRhU3Rvb2wgPC0gcm93bmFtZXNfdG9fY29sdW1uKG1ldGFkYXRhU3Rvb2wsIHZhciA9ICJTYW1wbGUiKQ0KDQpsdXRfZGYgPC0gZHBseXI6OnNlbGVjdChtZXRhZGF0YVN0b29sLCBTYW1wbGUsIFR3aW5fcGFpcnMsIFR3aW5fcGFpcnMpDQoNCiMgY29udmVydCBsdXRfZGYgaW50byBhIHZlY3Rvcg0KbHV0IDwtIGFzLmNoYXJhY3RlcihsdXRfZGYkVHdpbl9wYWlycykNCm5hbWVzKGx1dCkgPC0gbHV0X2RmJFNhbXBsZQ0KDQojIEFkZCBpbiB0aGUgc2hvcnQgbmFtZXMgdG8gdGhlIGRpc3RhbmNlIGRhdGEgZnJhbWVzDQp1bndlaWdodGVkRGlzdERGJFZhcjFfU2hvcnROYW1lIDwtIGx1dFt1bndlaWdodGVkRGlzdERGJFZhcjFdDQp1bndlaWdodGVkRGlzdERGJFZhcjJfU2hvcnROYW1lIDwtIGx1dFt1bndlaWdodGVkRGlzdERGJFZhcjJdDQoNCiMgQWRkIGEgY29sdW1uIGluZGljYXRpbmcgd2hldGhlciBhIGdpdmVuIHJvdyAocGFpcndpc2UgY29tcGFyaXNvbikgaXMgYmV0d2Vlbg0KIyAgIHR3byByZWxhdGVkIG9yIHVucmVsYXRlZCBzYW1wbGVzLg0KIyAgIExvb3Agb3ZlciB0aGUgcm93cyBvZiB0aGUgZGlzdGFuY2UgZGYsIHNwbGl0IFZhcjEgYW5kIFZhcjIgc2hvcnQgbmFtZXMgYnkgDQojICAgIi4iIGRlbGltaXRlciBhbmQgY29tcGFyZSB0aGUgMm5kIGVsZW1lbnQgb2YgdGhlIHJlc3VsdGluZyBsaXN0IHdoaWNoIHdpbGwgaG9sZCB0aGUgDQojICAgVGFyciBGYW1pbHkgSUQsDQoNCkFkZFBhaXJSZWxhdGlvbiA8LSBmdW5jdGlvbihkZikgew0KICANCiAgb2xkREYgPC0gZGYNCiAgDQogIHBhaXJSZWxhdGlvbiA8LSB2ZWN0b3IobW9kZSA9ICJjaGFyYWN0ZXIiLCBsZW5ndGggPSBucm93KG9sZERGKSkNCiAgDQogIGZvciAoaSBpbiAxOm5yb3cob2xkREYpKSB7DQogICAgVmFyMV9zcGxpdCA8LSBzdHJzcGxpdCh4ID0gZGZbaSwgIlZhcjFfU2hvcnROYW1lIl0sIHNwbGl0ID0gIlxcLiIpDQogICAgVmFyMl9zcGxpdCA8LSBzdHJzcGxpdCh4ID0gZGZbaSwgIlZhcjJfU2hvcnROYW1lIl0sIHNwbGl0ID0gIlxcLiIpDQogICAgDQogICAgaWYgKFZhcjFfc3BsaXRbWzFdXVtbMV1dID09IFZhcjJfc3BsaXRbWzFdXVtbMV1dKSB7DQogICAgICBwYWlyUmVsYXRpb25baV0gPC0gIkJldHdlZW4gXG4gdHdpbnMiDQogICAgfSBlbHNlIHsNCiAgICAgIHBhaXJSZWxhdGlvbltpXSA8LSAiQmV0d2VlbiBcbiB1bnJlbGF0ZWQiDQogICAgfQ0KICB9DQogIA0KICBvbGRERiRQYWlyX1JlbGF0aW9uIDwtIHBhaXJSZWxhdGlvbg0KICANCiAgcmV0dXJuKG9sZERGKQ0KICANCn0NCg0KdW53ZWlnaHRlZERpc3RERiA8LSBBZGRQYWlyUmVsYXRpb24odW53ZWlnaHRlZERpc3RERikNCg0KI1dlaWdodGVkIGRpc3RhbmNlIGJveHBsb3RzDQoNCkJyYXlQbG90LmJhYy4zMCA8LSANCiAgDQogIGdncGxvdCh1bndlaWdodGVkRGlzdERGLGFlcyhQYWlyX1JlbGF0aW9uLFVuaUZyYWNfRGlzdGFuY2UsZmlsbCA9IFBhaXJfUmVsYXRpb24pKSArDQogIGdlb21fYm94cGxvdChhZXMoZmlsbCA9IFBhaXJfUmVsYXRpb24pLG91dGxpZXIuc2hhcGU9TkEpKw0KICAjICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgKw0KICB5bGFiKCJCcmF5LWN1cnRpcyBkaXN0YW5jZSIpICsNCiAgeGxhYigiRGF5IDMwIikgKw0KICB0aGVtZV9wdWJjbGVhbigpICsNCiAgc2NhbGVfZmlsbF9qY28oKSArDQogIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAid2lsY294LnRlc3QiICxhZXMobGFiZWwgPSBwYXN0ZTAoInAgPSAiLCAuLnAuZm9ybWF0Li4pKSxsYWJlbC54Lm5wYz0iY2VudGVyIixsYWJlbC55PTAuNTUpICsNCiAgZ3VpZGVzKGZpbGw9Im5vbmUiKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkNCg0KI0JyYXlQbG90LmJhYw0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1Zpcm9tZQ0KDQojIyMjIyMjIyMjIyMjR2VuZXJhdGUgQnJheSBjdXJ0aXMgcGFpcndpc2UgZGlzdGFuY2UgZGF0YSBmcmFtZToNCg0KIyBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIG9iamVjdA0KbWV0YWRhdGFTdG9vbCA8LSBkYXRhLmZyYW1lKHNhbXBsZV9kYXRhKFBTVi5DU1Muc3ViKSkNCg0KdW53ZWlnaHRlZERpc3QgPC0gYXMubWF0cml4KHQoUFNWLkNTUy5zdWJAb3R1X3RhYmxlKSkNCg0KdW53ZWlnaHRlZERpc3QgPC0gdmVnZGlzdCh1bndlaWdodGVkRGlzdCwgZGlzdCA9ICJicmF5IikNCg0KIyBDb2VyY2UgZGlzdGFuY2Ugb2JqZWN0IGludG8gbWF0cml4DQp1bndlaWdodGVkRGlzdE10eCA8LSBhcy5tYXRyaXgodW53ZWlnaHRlZERpc3QpDQoNCiMgTWVsdCBhbmQgcmVtb3ZlIHZhbHVlcyBvZiAwIHRvIGVsaW1pbmF0ZSBkaXN0YW5jZXMgb2YgZWFjaCBzYW1wbGUgdG8gaXRzZWxmDQp1bndlaWdodGVkRGlzdE10eF9tZWx0IDwtIHN1YnNldChyZXNoYXBlMjo6bWVsdCh1bndlaWdodGVkRGlzdE10eCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gIlVuaUZyYWNfRGlzdGFuY2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaUZyYWNfRGlzdGFuY2UgIT0gMCkNCg0KIyBDaGFuZ2UgVmFyMSBhbmQgVmFyMiBmcm9tIGZhY3RvcnMgdG8gY2hhcmFjdGVycyBmb3IgZWFzaWVyIHVzZSB3aXRoIGRwbHlyDQpmYWN0b3JDb2xzIDwtIGMoIlZhcjEiLCAiVmFyMiIpDQp1bndlaWdodGVkRGlzdE10eF9tZWx0W2ZhY3RvckNvbHNdIDwtIGxhcHBseSh1bndlaWdodGVkRGlzdE10eF9tZWx0W2ZhY3RvckNvbHNdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3RlcikNCg0KIyBBZGQgY29sdW1ucyBmb3IgbGF0ZXIgc3Vic2V0dGluZyB3aGVuIHBsb3R0aW5nLiAgVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGdldA0KIyAgIHB1bGxlZCBmcm9tIHRoZSBtZXRhZGF0YSAobWV0YWRhdGFTdG9vbCkuICBXaXRoaW4gdGhlICpEaXN0TXR4X21lbHQgZGF0YSANCiMgICBmcmFtZXMsIHdlIG5lZWQgYSBjb2x1bW4gaW5kaWNhdGluZyB3aGV0aGVyIFZhcjEgYW5kIFZhcjIgYXJlIGluZmFudHMsDQojICAgbW90aGVycywgYW5kIHdoZXRoZXIgdGhleSdyZSByZWxhdGVkLg0KdW53ZWlnaHRlZERpc3RERiA8LSB1bndlaWdodGVkRGlzdE10eF9tZWx0DQoNCiMgQWRkIFZhcjEgYW5kIFZhcjIgVHlwZSBhbmQgWnlnb3NpdHkgY29sdW1ucw0KIyBQdXQgcm93bmFtZXMgYmFjayBpbiBtZXRhZGF0YVN0b29sLCB0aGVuIHVzZSB0aGUgcm93bmFtZXMgdG8gbG9jYXRlIG5lZWRlZCBpbmZvDQojIDwtIGNvbHVtbl90b19yb3duYW1lcyhtZXRhZGF0YVN0b29sLCB2YXIgPSAiVHdpbl9wYWlycyIpDQoNCnVud2VpZ2h0ZWREaXN0REYgPC0gdW53ZWlnaHRlZERpc3RERiAlPiUNCiAgbXV0YXRlKFZhcjFfVHlwZSA9IG1ldGFkYXRhU3Rvb2xbdW53ZWlnaHRlZERpc3RERiRWYXIxLCAiVHdpbl9wYWlycyJdLA0KICAgICAgICAgVmFyMl9UeXBlID0gbWV0YWRhdGFTdG9vbFt1bndlaWdodGVkRGlzdERGJFZhcjIsICJUd2luX3BhaXJzIl0pDQoNCiMgVG8gZWFzaWx5IGRldGVybWluZSB0aGUgcmVsYXRlZG5lc3Mgb2YgdGhlIHBhaXJlZCBzYW1wbGVzIGluIGVhY2ggcm93LA0KIyAgIGNyZWF0ZSAic2hvcnQgbmFtZXMiIHRvIHJlcGxhY2UgdGhlIGxvbmcgc2FtcGxlIG5hbWVzLg0KIyAgIEZpcnN0IHB1dCB0aGUgcm93bmFtZXMgYmFjayBpbnRvIGEgY29sdW1uLg0KDQptZXRhZGF0YVN0b29sIDwtIHJvd25hbWVzX3RvX2NvbHVtbihtZXRhZGF0YVN0b29sLCB2YXIgPSAiU2FtcGxlIikNCg0KbHV0X2RmIDwtIGRwbHlyOjpzZWxlY3QobWV0YWRhdGFTdG9vbCwgU2FtcGxlLCBUd2luX3BhaXJzLCBUd2luX3BhaXJzKQ0KDQojIGNvbnZlcnQgbHV0X2RmIGludG8gYSB2ZWN0b3INCmx1dCA8LSBhcy5jaGFyYWN0ZXIobHV0X2RmJFR3aW5fcGFpcnMpDQpuYW1lcyhsdXQpIDwtIGx1dF9kZiRTYW1wbGUNCg0KIyBBZGQgaW4gdGhlIHNob3J0IG5hbWVzIHRvIHRoZSBkaXN0YW5jZSBkYXRhIGZyYW1lcw0KdW53ZWlnaHRlZERpc3RERiRWYXIxX1Nob3J0TmFtZSA8LSBsdXRbdW53ZWlnaHRlZERpc3RERiRWYXIxXQ0KdW53ZWlnaHRlZERpc3RERiRWYXIyX1Nob3J0TmFtZSA8LSBsdXRbdW53ZWlnaHRlZERpc3RERiRWYXIyXQ0KDQojIEFkZCBhIGNvbHVtbiBpbmRpY2F0aW5nIHdoZXRoZXIgYSBnaXZlbiByb3cgKHBhaXJ3aXNlIGNvbXBhcmlzb24pIGlzIGJldHdlZW4NCiMgICB0d28gcmVsYXRlZCBvciB1bnJlbGF0ZWQgc2FtcGxlcy4NCiMgICBMb29wIG92ZXIgdGhlIHJvd3Mgb2YgdGhlIGRpc3RhbmNlIGRmLCBzcGxpdCBWYXIxIGFuZCBWYXIyIHNob3J0IG5hbWVzIGJ5IA0KIyAgICIuIiBkZWxpbWl0ZXIgYW5kIGNvbXBhcmUgdGhlIDJuZCBlbGVtZW50IG9mIHRoZSByZXN1bHRpbmcgbGlzdCB3aGljaCB3aWxsIGhvbGQgdGhlIA0KIyAgIFRhcnIgRmFtaWx5IElELA0KDQpBZGRQYWlyUmVsYXRpb24gPC0gZnVuY3Rpb24oZGYpIHsNCiAgDQogIG9sZERGIDwtIGRmDQogIA0KICBwYWlyUmVsYXRpb24gPC0gdmVjdG9yKG1vZGUgPSAiY2hhcmFjdGVyIiwgbGVuZ3RoID0gbnJvdyhvbGRERikpDQogIA0KICBmb3IgKGkgaW4gMTpucm93KG9sZERGKSkgew0KICAgIFZhcjFfc3BsaXQgPC0gc3Ryc3BsaXQoeCA9IGRmW2ksICJWYXIxX1Nob3J0TmFtZSJdLCBzcGxpdCA9ICJcXC4iKQ0KICAgIFZhcjJfc3BsaXQgPC0gc3Ryc3BsaXQoeCA9IGRmW2ksICJWYXIyX1Nob3J0TmFtZSJdLCBzcGxpdCA9ICJcXC4iKQ0KICAgIA0KICAgIGlmIChWYXIxX3NwbGl0W1sxXV1bWzFdXSA9PSBWYXIyX3NwbGl0W1sxXV1bWzFdXSkgew0KICAgICAgcGFpclJlbGF0aW9uW2ldIDwtICJCZXR3ZWVuIFxuIHR3aW5zIg0KICAgIH0gZWxzZSB7DQogICAgICBwYWlyUmVsYXRpb25baV0gPC0gIkJldHdlZW4gXG4gdW5yZWxhdGVkIg0KICAgIH0NCiAgfQ0KICANCiAgb2xkREYkUGFpcl9SZWxhdGlvbiA8LSBwYWlyUmVsYXRpb24NCiAgDQogIHJldHVybihvbGRERikNCiAgDQp9DQoNCnVud2VpZ2h0ZWREaXN0REYgPC0gQWRkUGFpclJlbGF0aW9uKHVud2VpZ2h0ZWREaXN0REYpDQoNCiNXZWlnaHRlZCBkaXN0YW5jZSBib3hwbG90cw0KDQpCcmF5UGxvdC52aXIuMzAgPC0gDQogIA0KICBnZ3Bsb3QodW53ZWlnaHRlZERpc3RERixhZXMoUGFpcl9SZWxhdGlvbixVbmlGcmFjX0Rpc3RhbmNlLGZpbGwgPSBQYWlyX1JlbGF0aW9uKSkgKw0KICBnZW9tX2JveHBsb3QoYWVzKGZpbGwgPSBQYWlyX1JlbGF0aW9uKSxvdXRsaWVyLnNoYXBlPU5BKSsNCiAgIyAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICsNCiAgeWxhYigiQnJheS1jdXJ0aXMgZGlzdGFuY2UiKSArDQogIHhsYWIoIkRheSAzMCIpICsNCiAgdGhlbWVfcHViY2xlYW4oKSArDQogIHNjYWxlX2ZpbGxfamNvKCkgKw0KICBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0IiAsYWVzKGxhYmVsID0gcGFzdGUwKCJwID0gIiwgLi5wLmZvcm1hdC4uKSksbGFiZWwueC5ucGM9ImNlbnRlciIsbGFiZWwueT0wLjU1KSArDQogIGd1aWRlcyhmaWxsPSJub25lIikgKw0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpDQojQnJheVBsb3QudmlyDQoNCnBsb3RfZ3JpZChCcmF5UGxvdC5iYWMuMzAsQnJheVBsb3QudmlyLjMwLCBucm93ID0gMSkNCmBgYA0KDQojIyMgRGF5IDkwDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQpzb3VyY2UoIkhlbHBlcl9GdW5jdGlvbnMuUiIpDQoNClBTQi5DU1Muc3ViIDwtIHN1YnNldF9zYW1wbGVzKFBTQi5DU1MsIERheXMgPT0gIjkwIikgDQoNClBTVi5DU1Muc3ViIDwtIHN1YnNldF9zYW1wbGVzKFBTVi5DU1MsIERheXMgPT0gIjkwIikgDQoNCiMjIyMjIyMjIyMjIyNHZW5lcmF0ZSBCcmF5IGN1cnRpcyBwYWlyd2lzZSBkaXN0YW5jZSBkYXRhIGZyYW1lOg0KDQojIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2Ugb2JqZWN0DQptZXRhZGF0YVN0b29sIDwtIGRhdGEuZnJhbWUoc2FtcGxlX2RhdGEoUFNCLkNTUy5zdWIpKQ0KDQp1bndlaWdodGVkRGlzdCA8LSBhcy5tYXRyaXgodChQU0IuQ1NTLnN1YkBvdHVfdGFibGUpKQ0KDQp1bndlaWdodGVkRGlzdCA8LSB2ZWdkaXN0KHVud2VpZ2h0ZWREaXN0LCBkaXN0ID0gImJyYXkiKQ0KDQojIENvZXJjZSBkaXN0YW5jZSBvYmplY3QgaW50byBtYXRyaXgNCnVud2VpZ2h0ZWREaXN0TXR4IDwtIGFzLm1hdHJpeCh1bndlaWdodGVkRGlzdCkNCg0KIyBNZWx0IGFuZCByZW1vdmUgdmFsdWVzIG9mIDAgdG8gZWxpbWluYXRlIGRpc3RhbmNlcyBvZiBlYWNoIHNhbXBsZSB0byBpdHNlbGYNCnVud2VpZ2h0ZWREaXN0TXR4X21lbHQgPC0gc3Vic2V0KHJlc2hhcGUyOjptZWx0KHVud2VpZ2h0ZWREaXN0TXR4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLm5hbWUgPSAiVW5pRnJhY19EaXN0YW5jZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pRnJhY19EaXN0YW5jZSAhPSAwKQ0KDQojIENoYW5nZSBWYXIxIGFuZCBWYXIyIGZyb20gZmFjdG9ycyB0byBjaGFyYWN0ZXJzIGZvciBlYXNpZXIgdXNlIHdpdGggZHBseXINCmZhY3RvckNvbHMgPC0gYygiVmFyMSIsICJWYXIyIikNCnVud2VpZ2h0ZWREaXN0TXR4X21lbHRbZmFjdG9yQ29sc10gPC0gbGFwcGx5KHVud2VpZ2h0ZWREaXN0TXR4X21lbHRbZmFjdG9yQ29sc10sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKQ0KDQojIEFkZCBjb2x1bW5zIGZvciBsYXRlciBzdWJzZXR0aW5nIHdoZW4gcGxvdHRpbmcuICBUaGlzIGluZm9ybWF0aW9uIHdpbGwgZ2V0DQojICAgcHVsbGVkIGZyb20gdGhlIG1ldGFkYXRhIChtZXRhZGF0YVN0b29sKS4gIFdpdGhpbiB0aGUgKkRpc3RNdHhfbWVsdCBkYXRhIA0KIyAgIGZyYW1lcywgd2UgbmVlZCBhIGNvbHVtbiBpbmRpY2F0aW5nIHdoZXRoZXIgVmFyMSBhbmQgVmFyMiBhcmUgaW5mYW50cywNCiMgICBtb3RoZXJzLCBhbmQgd2hldGhlciB0aGV5J3JlIHJlbGF0ZWQuDQp1bndlaWdodGVkRGlzdERGIDwtIHVud2VpZ2h0ZWREaXN0TXR4X21lbHQNCg0KIyBBZGQgVmFyMSBhbmQgVmFyMiBUeXBlIGFuZCBaeWdvc2l0eSBjb2x1bW5zDQojIFB1dCByb3duYW1lcyBiYWNrIGluIG1ldGFkYXRhU3Rvb2wsIHRoZW4gdXNlIHRoZSByb3duYW1lcyB0byBsb2NhdGUgbmVlZGVkIGluZm8NCiMgPC0gY29sdW1uX3RvX3Jvd25hbWVzKG1ldGFkYXRhU3Rvb2wsIHZhciA9ICJUd2luX3BhaXJzIikNCg0KdW53ZWlnaHRlZERpc3RERiA8LSB1bndlaWdodGVkRGlzdERGICU+JQ0KICBtdXRhdGUoVmFyMV9UeXBlID0gbWV0YWRhdGFTdG9vbFt1bndlaWdodGVkRGlzdERGJFZhcjEsICJUd2luX3BhaXJzIl0sDQogICAgICAgICBWYXIyX1R5cGUgPSBtZXRhZGF0YVN0b29sW3Vud2VpZ2h0ZWREaXN0REYkVmFyMiwgIlR3aW5fcGFpcnMiXSkNCg0KIyBUbyBlYXNpbHkgZGV0ZXJtaW5lIHRoZSByZWxhdGVkbmVzcyBvZiB0aGUgcGFpcmVkIHNhbXBsZXMgaW4gZWFjaCByb3csDQojICAgY3JlYXRlICJzaG9ydCBuYW1lcyIgdG8gcmVwbGFjZSB0aGUgbG9uZyBzYW1wbGUgbmFtZXMuDQojICAgRmlyc3QgcHV0IHRoZSByb3duYW1lcyBiYWNrIGludG8gYSBjb2x1bW4uDQoNCm1ldGFkYXRhU3Rvb2wgPC0gcm93bmFtZXNfdG9fY29sdW1uKG1ldGFkYXRhU3Rvb2wsIHZhciA9ICJTYW1wbGUiKQ0KDQpsdXRfZGYgPC0gZHBseXI6OnNlbGVjdChtZXRhZGF0YVN0b29sLCBTYW1wbGUsIFR3aW5fcGFpcnMsIFR3aW5fcGFpcnMpDQoNCiMgY29udmVydCBsdXRfZGYgaW50byBhIHZlY3Rvcg0KbHV0IDwtIGFzLmNoYXJhY3RlcihsdXRfZGYkVHdpbl9wYWlycykNCm5hbWVzKGx1dCkgPC0gbHV0X2RmJFNhbXBsZQ0KDQojIEFkZCBpbiB0aGUgc2hvcnQgbmFtZXMgdG8gdGhlIGRpc3RhbmNlIGRhdGEgZnJhbWVzDQp1bndlaWdodGVkRGlzdERGJFZhcjFfU2hvcnROYW1lIDwtIGx1dFt1bndlaWdodGVkRGlzdERGJFZhcjFdDQp1bndlaWdodGVkRGlzdERGJFZhcjJfU2hvcnROYW1lIDwtIGx1dFt1bndlaWdodGVkRGlzdERGJFZhcjJdDQoNCiMgQWRkIGEgY29sdW1uIGluZGljYXRpbmcgd2hldGhlciBhIGdpdmVuIHJvdyAocGFpcndpc2UgY29tcGFyaXNvbikgaXMgYmV0d2Vlbg0KIyAgIHR3byByZWxhdGVkIG9yIHVucmVsYXRlZCBzYW1wbGVzLg0KIyAgIExvb3Agb3ZlciB0aGUgcm93cyBvZiB0aGUgZGlzdGFuY2UgZGYsIHNwbGl0IFZhcjEgYW5kIFZhcjIgc2hvcnQgbmFtZXMgYnkgDQojICAgIi4iIGRlbGltaXRlciBhbmQgY29tcGFyZSB0aGUgMm5kIGVsZW1lbnQgb2YgdGhlIHJlc3VsdGluZyBsaXN0IHdoaWNoIHdpbGwgaG9sZCB0aGUgDQojICAgVGFyciBGYW1pbHkgSUQsDQoNCkFkZFBhaXJSZWxhdGlvbiA8LSBmdW5jdGlvbihkZikgew0KICANCiAgb2xkREYgPC0gZGYNCiAgDQogIHBhaXJSZWxhdGlvbiA8LSB2ZWN0b3IobW9kZSA9ICJjaGFyYWN0ZXIiLCBsZW5ndGggPSBucm93KG9sZERGKSkNCiAgDQogIGZvciAoaSBpbiAxOm5yb3cob2xkREYpKSB7DQogICAgVmFyMV9zcGxpdCA8LSBzdHJzcGxpdCh4ID0gZGZbaSwgIlZhcjFfU2hvcnROYW1lIl0sIHNwbGl0ID0gIlxcLiIpDQogICAgVmFyMl9zcGxpdCA8LSBzdHJzcGxpdCh4ID0gZGZbaSwgIlZhcjJfU2hvcnROYW1lIl0sIHNwbGl0ID0gIlxcLiIpDQogICAgDQogICAgaWYgKFZhcjFfc3BsaXRbWzFdXVtbMV1dID09IFZhcjJfc3BsaXRbWzFdXVtbMV1dKSB7DQogICAgICBwYWlyUmVsYXRpb25baV0gPC0gIkJldHdlZW4gXG4gdHdpbnMiDQogICAgfSBlbHNlIHsNCiAgICAgIHBhaXJSZWxhdGlvbltpXSA8LSAiQmV0d2VlbiBcbiB1bnJlbGF0ZWQiDQogICAgfQ0KICB9DQogIA0KICBvbGRERiRQYWlyX1JlbGF0aW9uIDwtIHBhaXJSZWxhdGlvbg0KICANCiAgcmV0dXJuKG9sZERGKQ0KICANCn0NCg0KdW53ZWlnaHRlZERpc3RERiA8LSBBZGRQYWlyUmVsYXRpb24odW53ZWlnaHRlZERpc3RERikNCg0KI1dlaWdodGVkIGRpc3RhbmNlIGJveHBsb3RzDQoNCkJyYXlQbG90LmJhYy45MCA8LSANCiAgDQogIGdncGxvdCh1bndlaWdodGVkRGlzdERGLGFlcyhQYWlyX1JlbGF0aW9uLFVuaUZyYWNfRGlzdGFuY2UsZmlsbCA9IFBhaXJfUmVsYXRpb24pKSArDQogIGdlb21fYm94cGxvdChhZXMoZmlsbCA9IFBhaXJfUmVsYXRpb24pLG91dGxpZXIuc2hhcGU9TkEpKw0KICAjICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgKw0KICB5bGFiKCJCcmF5LWN1cnRpcyBkaXN0YW5jZSIpICsNCiAgeGxhYigiRGF5IDkwIikgKw0KICB0aGVtZV9wdWJjbGVhbigpICsNCiAgc2NhbGVfZmlsbF9qY28oKSArDQogIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAid2lsY294LnRlc3QiICxhZXMobGFiZWwgPSBwYXN0ZTAoInAgPSAiLCAuLnAuZm9ybWF0Li4pKSxsYWJlbC54Lm5wYz0iY2VudGVyIixsYWJlbC55PTAuNCkgKw0KICBndWlkZXMoZmlsbD0ibm9uZSIpICsNCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKQ0KDQojQnJheVBsb3QuYmFjDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjVmlyb21lDQoNCiMjIyMjIyMjIyMjIyNHZW5lcmF0ZSBCcmF5IGN1cnRpcyBwYWlyd2lzZSBkaXN0YW5jZSBkYXRhIGZyYW1lOg0KDQojIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2Ugb2JqZWN0DQptZXRhZGF0YVN0b29sIDwtIGRhdGEuZnJhbWUoc2FtcGxlX2RhdGEoUFNWLkNTUy5zdWIpKQ0KDQp1bndlaWdodGVkRGlzdCA8LSBhcy5tYXRyaXgodChQU1YuQ1NTLnN1YkBvdHVfdGFibGUpKQ0KDQp1bndlaWdodGVkRGlzdCA8LSB2ZWdkaXN0KHVud2VpZ2h0ZWREaXN0LCBkaXN0ID0gImJyYXkiKQ0KDQojIENvZXJjZSBkaXN0YW5jZSBvYmplY3QgaW50byBtYXRyaXgNCnVud2VpZ2h0ZWREaXN0TXR4IDwtIGFzLm1hdHJpeCh1bndlaWdodGVkRGlzdCkNCg0KIyBNZWx0IGFuZCByZW1vdmUgdmFsdWVzIG9mIDAgdG8gZWxpbWluYXRlIGRpc3RhbmNlcyBvZiBlYWNoIHNhbXBsZSB0byBpdHNlbGYNCnVud2VpZ2h0ZWREaXN0TXR4X21lbHQgPC0gc3Vic2V0KHJlc2hhcGUyOjptZWx0KHVud2VpZ2h0ZWREaXN0TXR4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLm5hbWUgPSAiVW5pRnJhY19EaXN0YW5jZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pRnJhY19EaXN0YW5jZSAhPSAwKQ0KDQojIENoYW5nZSBWYXIxIGFuZCBWYXIyIGZyb20gZmFjdG9ycyB0byBjaGFyYWN0ZXJzIGZvciBlYXNpZXIgdXNlIHdpdGggZHBseXINCmZhY3RvckNvbHMgPC0gYygiVmFyMSIsICJWYXIyIikNCnVud2VpZ2h0ZWREaXN0TXR4X21lbHRbZmFjdG9yQ29sc10gPC0gbGFwcGx5KHVud2VpZ2h0ZWREaXN0TXR4X21lbHRbZmFjdG9yQ29sc10sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKQ0KDQojIEFkZCBjb2x1bW5zIGZvciBsYXRlciBzdWJzZXR0aW5nIHdoZW4gcGxvdHRpbmcuICBUaGlzIGluZm9ybWF0aW9uIHdpbGwgZ2V0DQojICAgcHVsbGVkIGZyb20gdGhlIG1ldGFkYXRhIChtZXRhZGF0YVN0b29sKS4gIFdpdGhpbiB0aGUgKkRpc3RNdHhfbWVsdCBkYXRhIA0KIyAgIGZyYW1lcywgd2UgbmVlZCBhIGNvbHVtbiBpbmRpY2F0aW5nIHdoZXRoZXIgVmFyMSBhbmQgVmFyMiBhcmUgaW5mYW50cywNCiMgICBtb3RoZXJzLCBhbmQgd2hldGhlciB0aGV5J3JlIHJlbGF0ZWQuDQp1bndlaWdodGVkRGlzdERGIDwtIHVud2VpZ2h0ZWREaXN0TXR4X21lbHQNCg0KIyBBZGQgVmFyMSBhbmQgVmFyMiBUeXBlIGFuZCBaeWdvc2l0eSBjb2x1bW5zDQojIFB1dCByb3duYW1lcyBiYWNrIGluIG1ldGFkYXRhU3Rvb2wsIHRoZW4gdXNlIHRoZSByb3duYW1lcyB0byBsb2NhdGUgbmVlZGVkIGluZm8NCiMgPC0gY29sdW1uX3RvX3Jvd25hbWVzKG1ldGFkYXRhU3Rvb2wsIHZhciA9ICJUd2luX3BhaXJzIikNCg0KdW53ZWlnaHRlZERpc3RERiA8LSB1bndlaWdodGVkRGlzdERGICU+JQ0KICBtdXRhdGUoVmFyMV9UeXBlID0gbWV0YWRhdGFTdG9vbFt1bndlaWdodGVkRGlzdERGJFZhcjEsICJUd2luX3BhaXJzIl0sDQogICAgICAgICBWYXIyX1R5cGUgPSBtZXRhZGF0YVN0b29sW3Vud2VpZ2h0ZWREaXN0REYkVmFyMiwgIlR3aW5fcGFpcnMiXSkNCg0KIyBUbyBlYXNpbHkgZGV0ZXJtaW5lIHRoZSByZWxhdGVkbmVzcyBvZiB0aGUgcGFpcmVkIHNhbXBsZXMgaW4gZWFjaCByb3csDQojICAgY3JlYXRlICJzaG9ydCBuYW1lcyIgdG8gcmVwbGFjZSB0aGUgbG9uZyBzYW1wbGUgbmFtZXMuDQojICAgRmlyc3QgcHV0IHRoZSByb3duYW1lcyBiYWNrIGludG8gYSBjb2x1bW4uDQoNCm1ldGFkYXRhU3Rvb2wgPC0gcm93bmFtZXNfdG9fY29sdW1uKG1ldGFkYXRhU3Rvb2wsIHZhciA9ICJTYW1wbGUiKQ0KDQpsdXRfZGYgPC0gZHBseXI6OnNlbGVjdChtZXRhZGF0YVN0b29sLCBTYW1wbGUsIFR3aW5fcGFpcnMsIFR3aW5fcGFpcnMpDQoNCiMgY29udmVydCBsdXRfZGYgaW50byBhIHZlY3Rvcg0KbHV0IDwtIGFzLmNoYXJhY3RlcihsdXRfZGYkVHdpbl9wYWlycykNCm5hbWVzKGx1dCkgPC0gbHV0X2RmJFNhbXBsZQ0KDQojIEFkZCBpbiB0aGUgc2hvcnQgbmFtZXMgdG8gdGhlIGRpc3RhbmNlIGRhdGEgZnJhbWVzDQp1bndlaWdodGVkRGlzdERGJFZhcjFfU2hvcnROYW1lIDwtIGx1dFt1bndlaWdodGVkRGlzdERGJFZhcjFdDQp1bndlaWdodGVkRGlzdERGJFZhcjJfU2hvcnROYW1lIDwtIGx1dFt1bndlaWdodGVkRGlzdERGJFZhcjJdDQoNCiMgQWRkIGEgY29sdW1uIGluZGljYXRpbmcgd2hldGhlciBhIGdpdmVuIHJvdyAocGFpcndpc2UgY29tcGFyaXNvbikgaXMgYmV0d2Vlbg0KIyAgIHR3byByZWxhdGVkIG9yIHVucmVsYXRlZCBzYW1wbGVzLg0KIyAgIExvb3Agb3ZlciB0aGUgcm93cyBvZiB0aGUgZGlzdGFuY2UgZGYsIHNwbGl0IFZhcjEgYW5kIFZhcjIgc2hvcnQgbmFtZXMgYnkgDQojICAgIi4iIGRlbGltaXRlciBhbmQgY29tcGFyZSB0aGUgMm5kIGVsZW1lbnQgb2YgdGhlIHJlc3VsdGluZyBsaXN0IHdoaWNoIHdpbGwgaG9sZCB0aGUgDQojICAgVGFyciBGYW1pbHkgSUQsDQoNCkFkZFBhaXJSZWxhdGlvbiA8LSBmdW5jdGlvbihkZikgew0KICANCiAgb2xkREYgPC0gZGYNCiAgDQogIHBhaXJSZWxhdGlvbiA8LSB2ZWN0b3IobW9kZSA9ICJjaGFyYWN0ZXIiLCBsZW5ndGggPSBucm93KG9sZERGKSkNCiAgDQogIGZvciAoaSBpbiAxOm5yb3cob2xkREYpKSB7DQogICAgVmFyMV9zcGxpdCA8LSBzdHJzcGxpdCh4ID0gZGZbaSwgIlZhcjFfU2hvcnROYW1lIl0sIHNwbGl0ID0gIlxcLiIpDQogICAgVmFyMl9zcGxpdCA8LSBzdHJzcGxpdCh4ID0gZGZbaSwgIlZhcjJfU2hvcnROYW1lIl0sIHNwbGl0ID0gIlxcLiIpDQogICAgDQogICAgaWYgKFZhcjFfc3BsaXRbWzFdXVtbMV1dID09IFZhcjJfc3BsaXRbWzFdXVtbMV1dKSB7DQogICAgICBwYWlyUmVsYXRpb25baV0gPC0gIkJldHdlZW4gXG4gdHdpbnMiDQogICAgfSBlbHNlIHsNCiAgICAgIHBhaXJSZWxhdGlvbltpXSA8LSAiQmV0d2VlbiBcbiB1bnJlbGF0ZWQiDQogICAgfQ0KICB9DQogIA0KICBvbGRERiRQYWlyX1JlbGF0aW9uIDwtIHBhaXJSZWxhdGlvbg0KICANCiAgcmV0dXJuKG9sZERGKQ0KICANCn0NCg0KdW53ZWlnaHRlZERpc3RERiA8LSBBZGRQYWlyUmVsYXRpb24odW53ZWlnaHRlZERpc3RERikNCg0KI1dlaWdodGVkIGRpc3RhbmNlIGJveHBsb3RzDQoNCnN5bW51bSA8LSBsaXN0KGN1dHBvaW50cyA9IGMoMCwgMC4wMDAxLCAwLjAwMSwgMC4wMSwgMC4wNSwgMSksIHN5bWJvbHMgPSBjKCIqKioqIiwgIioqKiIsICIqKiIsICIqIiwgIm5zIikpDQoNCkJyYXlQbG90LnZpci45MCA8LSANCiAgDQogIGdncGxvdCh1bndlaWdodGVkRGlzdERGLGFlcyhQYWlyX1JlbGF0aW9uLFVuaUZyYWNfRGlzdGFuY2UsZmlsbCA9IFBhaXJfUmVsYXRpb24pKSArDQogIGdlb21fYm94cGxvdChhZXMoZmlsbCA9IFBhaXJfUmVsYXRpb24pLG91dGxpZXIuc2hhcGU9TkEpKw0KICAjICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgKw0KICB5bGFiKCJCcmF5LWN1cnRpcyBkaXN0YW5jZSIpICsNCiAgeGxhYigiRGF5IDkwIikgKw0KICB0aGVtZV9wdWJjbGVhbigpICsNCiAgc2NhbGVfZmlsbF9qY28oKSArDQogIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAid2lsY294LnRlc3QiICwgYWVzKGxhYmVsID0gcGFzdGUwKCJwID0gIiwgLi5wLmZvcm1hdC4uKSksbGFiZWwueC5ucGM9ImNlbnRlciIsbGFiZWwueT0wLjUpICsNCiAgZ3VpZGVzKGZpbGw9Im5vbmUiKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkNCg0KI0JyYXlQbG90LnZpcg0KDQpwbG90X2dyaWQoQnJheVBsb3QuYmFjLjkwLEJyYXlQbG90LnZpci45MCwgbnJvdyA9IDEpDQpgYGANCg0KIyBFZmZlY3Qgc2l6ZQ0KDQojIyBCYWN0ZXJpYQ0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEZ9DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI0ltcG9ydGluZy1EYXRhDQoNCiMjIyMjIyMjI0JhY3RlcmlhDQoNCiNzdGFuZGYgPSBmdW5jdGlvbih4LCB0PXRvdGFsKSByb3VuZCh0ICogKHggLyBzdW0oeCkpKQ0KI3RvdGFsID0gbWVkaWFuKHNhbXBsZV9zdW1zKFBTQikpDQojUFNCLlIgPSB0cmFuc2Zvcm1fc2FtcGxlX2NvdW50cyhQU0IsIHN0YW5kZikNCg0KaW1wb3J0Lm90dS50YWJsZSA8LSBhcy5kYXRhLmZyYW1lKG90dV90YWJsZShQU0IpKSAlPiUNCiAgI2RwbHlyOjpzZWxlY3QoLXRheG9ub215KSAlPiUNCiAgbXV0YXRlX2FsbChhcy5udW1lcmljKSAjQ29udmVydCB0byBudW1lcmljIHdoZXJlIHBvc3NpYmxlDQoNCmN1cmUuZGF0YSA9IG1ldGEuYmFjDQoNCiNpbXBvcnQudGF4b25vbXkgPSByZWFkLnRhYmxlKCd2aXJvbWVfdGF4b25vbXlfTENBX2tub3duLnR4dCcsIGhlYWRlciA9IFQpDQoNCnJvd25hbWVzIDwtIHJvd25hbWVzKGN1cmUuZGF0YSkNCg0KI1JlbW92ZSBOQSBjb2xvbW5zDQoNCmN1cmUuZGF0YSA8LSBjdXJlLmRhdGFbICwgISBhcHBseSggY3VyZS5kYXRhICwgMiAsIGZ1bmN0aW9uKHgpIGFsbChpcy5uYSh4KSkgKSBdDQoNCiNTZXQgbnVtZXJpYyBjb2x1bW4gY2xhc3MNCmN1cmUuZGF0YSA8LSBjdXJlLmRhdGEgJT4lIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsYXMuZmFjdG9yKQ0KI0FkZCBiYWNrIHJvd25hbWVzDQoNCnJvd25hbWVzKGN1cmUuZGF0YSkgPC0gcm93bmFtZXMNCg0KI2N1cmUuZGF0YSA8LSBjdXJlLmRhdGEgJT4lIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLm51bWVyaWMpDQoNClg4Lm5vbnJhcmVmaWVkID0gdChpbXBvcnQub3R1LnRhYmxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyUlJSBub24tcmFyZWZpZWQNCg0KDQojIyNyYXJlZnlpbmd8c3Vic2FtcGxpbmcgcmVhZHMgaW4gZXZlcnkgc2FtcGxlDQpiYXJwbG90KGNvbFN1bXMoaW1wb3J0Lm90dS50YWJsZSkpDQptaW4oY29sU3VtcyhpbXBvcnQub3R1LnRhYmxlKSkNCg0KcmFyZTggPC0gdChpbXBvcnQub3R1LnRhYmxlKQ0KI3JhcmU4ID0gcmFyZWZ5KHQoaW1wb3J0Lm90dS50YWJsZSksIHNhbXBsZSA9IDIwMDAwKQ0KWDgucmFyZWZpZWQgPSBhcy5kYXRhLmZyYW1lKHJhcmU4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjJSUlIHJhcmVmaWVkDQoNCiMjI1N1YnNldCBtZXRhZGF0YSB0byBtYXRjaCByZW1haW5pbmcgc2FtcGxlcyBhZnRlciByYXJlZmFjdGlvbg0KDQpZLmFsbCA9IGN1cmUuZGF0YVtyb3duYW1lcyhYOC5yYXJlZmllZCksXQ0KDQojIyNMb2cgdHJhbmZvcm1hdGlvbg0KWCA9IGxvZzEwKFg4LnJhcmVmaWVkKzEpDQoNCiNTZWxlY3QgcmVsZXZhbnQgbnVtZXJpYyBjb2x1bW4NCg0KWSA8LSBkcGx5cjo6c2VsZWN0KFkuYWxsLGMoIlR3aW5fcGFpcnMiLCAiRGF5cyIsICJHZXN0YXRpb25hbF9hZ2UiLCAiQmlydGhfd2VpZ2h0IiwgIlNtYWxsX2Zvcl9nZXN0YXRpb25hbF9hZ2UiLCAiQW50ZW5hdGFsX3N0ZXJvaWRzIiAsICJEZWxpdmVyeV9tb2RlIiwgIkludHJhcGFydHVtX2FudGliaW90aWNfcHJvcGh5bGF4aXMiLCAiTGF0ZV9vbnNldF9zZXBzaXMiICwgIk5lY3JvdGl6aW5nX2VudGVyb2NvbGl0aXMiLCAiUGF0ZW50X2R1Y3R1c19hcnRlcmlvc3VzIiwgIkJyb25jaG9wdWxtb25hcnlfZHlzcGxhc2lhIiwgIkFudGliaW90aWNzX2F0X2JpcnRoIiwgIlRvdGFsX2RheXNfYW50aWJpb3RpY3NfdGhlcmFweSIpKQ0KDQojY29sbmFtZXMoWSkgI0NoZWNrIHJlbWFpbmluZyBjb2x1bW5zDQoNCiMjI1NlbGVjdCBvbmx5IG51bWVyaWMgbWV0YWRhdGEgY3VsdW1ucw0KDQojWSAgPC0gWSAlPiUgbXV0YXRlX2FsbChhcy5udW1lcmljKQ0KDQojY29sbmFtZXMoWSkgI0NoZWNrIHJlbWFpbmluZyBjb2x1bW5zDQoNCiMjdmlmY29yDQojY29sbGluZWFyaXR5IDwtIHZpZmNvcihZLCB0aCAgPTAuNSkgI2F0IDAuNSB0aHJlc2hvbGQgdmFyaWFibGVzIGhhdmUgYSBWSUYgYmVsb3cgMTAuMDAgKDwwLjIxIGNvcnJlbGF0aW9uISkNCiNjb2xsaW5lYXJpdHkNCg0KI1NlbGVjdCByZWxldmFudCBjb2x1bW5zIGZvciB0aGF0IGFyZSBub24tY29sbGluZWFyDQoNClkuYWQgPSBZDQojWS5hZCA8LSBkcGx5cjo6c2VsZWN0KFkuYWxsLGMoIkJhdGNoIiwgIlRpbWUiKQ0KDQojWS5hZCA8LSBZLmFsbFs4OjIzXQ0KDQojUmVtb3ZlIE5BIHJvd3MNCg0KWS5hZCA8LSBZLmFkICU+JSBkcm9wX25hKCkNCg0KWC5hZCA8LSBYW3Jvd25hbWVzKFkuYWQpLF0NCg0KI2lzLm5hKFkuYWQpDQpgYGANCg0KIyMjIERiIGFub3ZhIC0gY29uc3RyYWluZWQgYnkgdGltZSBwb2ludA0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KIyMjIyMjIyMjIyMjIyNBbm92YSBvbiBjYXBzY2FsZSAtIGFsbCB2YXJpYWJsZXMNCg0KYW5vdmEubSA8LSBtYXRyaXgobnJvdyA9IDAsIG5jb2wgPTYpICNDcmVhdGUgbWF0cml4IGZvciByZXN1bHRzDQpjb2xuYW1lcyhhbm92YS5tKSA8LSBjKCJEZiIsIlN1bU9mU3FzIiwiRiIsIlByLkYiLCJSZXNpZHVhbC5EZiIsIlJlc2lkdWFsLlN1bU9mU3FzIikgICAgICAgICAgICAgICAgDQpmb3IgKGkgaW4gY29sbmFtZXMoZHBseXI6OnNlbGVjdChZLmFkLC1jKCJEYXlzIikpKSl7DQogIGFub3ZhIDwtIGFzLm1hdHJpeChhbm92YS5jY2EoY2Fwc2NhbGUoWC5hZCB+IFkuYWRbLGldICsgQ29uZGl0aW9uKERheXMpLCBZLmFkLCBkaXN0ID0gImJyYXkiKSxwZXJtdXRhdGlvbnMgPSBob3cobnBlcm09OTk5OSkpKQ0KICBhbm92YSA8LSBjKGFub3ZhWzEsXSxhbm92YVsyLDE6Ml0pDQogIGFub3ZhLm0gPC1yYmluZChhbm92YS5tLGFub3ZhKQ0KfQ0KDQpyb3duYW1lcyhhbm92YS5tKSA8LSBjb2xuYW1lcyhkcGx5cjo6c2VsZWN0KFkuYWQsLWMoIkRheXMiKSkpDQoNCiNQcmVwYXJlIGZvciBwbG90dGluZw0KDQphbm92YS5kYXQgPC0gYW5vdmEubSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpICU+JQ0KICB0aWJibGU6OmFkZF9jb2x1bW4oVmFyaWFibGUgPSByb3duYW1lcyhhbm92YS5tKSwubmFtZV9yZXBhaXIgPSAibWluaW1hbCIpIA0KDQojQWRkIGFkanVzdGVkIHAtdmFsdWVzDQphbm92YS5kYXQkUHIuRi5hZGogPC0gcC5hZGp1c3QoYW5vdmEuZGF0JFByLkYsIG1ldGhvZCA9ICdob2xtJykNCg0KI1Nob3cgdGFibGUNCiNrbml0cjo6a2FibGUoYW5vdmEuZGF0KQ0KDQojQ2FsY3VsYXRlIFJeMiBmcm9tIHN1bSBvZiBzcXVhcmVzDQphbm92YS5kYXQkUjIgPC0gYW5vdmEuZGF0JFN1bU9mU3FzIC8gKGFub3ZhLmRhdCRTdW1PZlNxcyArIGFub3ZhLmRhdCRSZXNpZHVhbC5TdW1PZlNxcykNCg0KIyNGYW5jeSBwbG90DQoNCmFub3ZhLm1lbHQgPC0gdGlkeXI6OnBpdm90X2xvbmdlcihhbm92YS5kYXQsY29scz1jKCJSMiIpLCBuYW1lc190bz0nbWVhc3VyZScsIHZhbHVlc190bz0idmFsdWUiKSAlPiUNCiAgYWRkX3NpZ25pZmljYW5jZShwLmNvbCA9ICJQci5GLmFkaiIsIG91dHB1dC5jb2wgPSAiUHJGLnN5bSIsDQogICAgICAgICAgICAgICAgICAgY3V0cG9pbnRzID0gYygwLCAxZS0wNCwgMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSwxKSwNCiAgICAgICAgICAgICAgICAgICBzeW1ib2xzID0gYygiKioqKiIsICIqKioiLCAiKioiLCAiKiIsICJcdTAyRDkiLCAiIikNCiAgICAgICAgICAgICAgICAgICApICU+JQ0KICBhcnJhbmdlKHZhbHVlKQ0KDQphbm92YS5tZWx0LmJhYyA8LSBhbm92YS5tZWx0ICU+JSBtdXRhdGUoVmFyaWFibGUgPSBnc3ViKCJfIiwgIiAiLFZhcmlhYmxlKSkNCg0KZmFuY3kuYW5vdmEuYmFyLmJhYyA8LSBnZ2JhcnBsb3QoYW5vdmEubWVsdC5iYWMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg9IlZhcmlhYmxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT0idmFsdWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY29sb3IgPSAiVmFyaWFibGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IGMoImhvcml6b250YWwiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBOQSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJtZWFzdXJlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBhbm92YS5tZWx0JFByRi5zeW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYi5zaXplID0gOSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiLnZqdXN0ID0gMC43LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWIuaGp1c3QgPSAtMC4zDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKSArDQogICNzdGF0X3B2YWx1ZV9tYW51YWwoDQogICMgIGFkb25pcy5tZWx0LCAgbGFiZWwgPSAiUHJGLnN5bSIsIHRpcC5sZW5ndGggPSAwLjAxDQogICMpICsNCiAgI2dlb21faGxpbmUoeWludGVyY2VwdCA9IDAuMDUpICsNCiAgZ2d0aXRsZSgiQ2Fwc2NhbGUgZGJSREEgZWZmZWN0IHNpemU6IGFsbCB2YXJpYWJsZXMiKSArDQogIHlsYWIoZXhwcmVzc2lvbihSXjJ+InZhbHVlIikpICsNCiAgc2NhbGVfZmlsbF9qY28oKQ0KDQpmYW5jeS5hbm92YS5iYXIuYmFjDQpgYGANCg0KIyMgVmlyb21lDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRn0NCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjSW1wb3J0aW5nLURhdGENCg0KI3N0YW5kZiA9IGZ1bmN0aW9uKHgsIHQ9dG90YWwpIHJvdW5kKHQgKiAoeCAvIHN1bSh4KSkpDQojdG90YWwgPSBtZWRpYW4oc2FtcGxlX3N1bXMoUFNWKSkNCiNQU1YuUiA9IHRyYW5zZm9ybV9zYW1wbGVfY291bnRzKFBTViwgc3RhbmRmKQ0KDQppbXBvcnQub3R1LnRhYmxlIDwtIGFzLmRhdGEuZnJhbWUob3R1X3RhYmxlKFBTVikpICU+JQ0KICAjZHBseXI6OnNlbGVjdCgtdGF4b25vbXkpICU+JQ0KICBtdXRhdGVfYWxsKGFzLm51bWVyaWMpICNDb252ZXJ0IHRvIG51bWVyaWMgd2hlcmUgcG9zc2libGUNCg0KY3VyZS5kYXRhID0gbWV0YS52aXINCg0KI2ltcG9ydC50YXhvbm9teSA9IHJlYWQudGFibGUoJ3Zpcm9tZV90YXhvbm9teV9MQ0Ffa25vd24udHh0JywgaGVhZGVyID0gVCkNCg0Kcm93bmFtZXMgPC0gcm93bmFtZXMoY3VyZS5kYXRhKQ0KDQojUmVtb3ZlIE5BIGNvbG9tbnMNCg0KY3VyZS5kYXRhIDwtIGN1cmUuZGF0YVsgLCAhIGFwcGx5KCBjdXJlLmRhdGEgLCAyICwgZnVuY3Rpb24oeCkgYWxsKGlzLm5hKHgpKSApIF0NCg0KI1NldCBudW1lcmljIGNvbHVtbiBjbGFzcw0KY3VyZS5kYXRhIDwtIGN1cmUuZGF0YSAlPiUgbXV0YXRlX2lmKGlzLmNoYXJhY3Rlcixhcy5mYWN0b3IpDQojQWRkIGJhY2sgcm93bmFtZXMNCg0Kcm93bmFtZXMoY3VyZS5kYXRhKSA8LSByb3duYW1lcw0KDQojY3VyZS5kYXRhIDwtIGN1cmUuZGF0YSAlPiUgbXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgYXMubnVtZXJpYykNCg0KWDgubm9ucmFyZWZpZWQgPSB0KGltcG9ydC5vdHUudGFibGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjJSUlIG5vbi1yYXJlZmllZA0KDQoNCiMjI3JhcmVmeWluZ3xzdWJzYW1wbGluZyByZWFkcyBpbiBldmVyeSBzYW1wbGUNCmJhcnBsb3QoY29sU3VtcyhpbXBvcnQub3R1LnRhYmxlKSkNCm1pbihjb2xTdW1zKGltcG9ydC5vdHUudGFibGUpKQ0KDQpyYXJlOCA8LSB0KGltcG9ydC5vdHUudGFibGUpDQojcmFyZTggPSByYXJlZnkodChpbXBvcnQub3R1LnRhYmxlKSwgc2FtcGxlID0gNDUwMDAwKQ0KWDgucmFyZWZpZWQgPSBhcy5kYXRhLmZyYW1lKHJhcmU4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjJSUlIHJhcmVmaWVkDQoNCiMjI1N1YnNldCBtZXRhZGF0YSB0byBtYXRjaCByZW1haW5pbmcgc2FtcGxlcyBhZnRlciByYXJlZmFjdGlvbg0KDQpZLmFsbCA9IGN1cmUuZGF0YVtyb3duYW1lcyhYOC5yYXJlZmllZCksXQ0KDQojIyNMb2cgdHJhbmZvcm1hdGlvbg0KWCA9IGxvZzEwKFg4LnJhcmVmaWVkKzEpDQoNCiNTZWxlY3QgcmVsZXZhbnQgbnVtZXJpYyBjb2x1bW4NCg0KWSA8LSBkcGx5cjo6c2VsZWN0KFkuYWxsLGMoIlR3aW5fcGFpcnMiLCAiRGF5cyIsICJHZXN0YXRpb25hbF9hZ2UiLCAiQmlydGhfd2VpZ2h0IiwgIlNtYWxsX2Zvcl9nZXN0YXRpb25hbF9hZ2UiLCAiQW50ZW5hdGFsX3N0ZXJvaWRzIiAsICJEZWxpdmVyeV9tb2RlIiwgIkludHJhcGFydHVtX2FudGliaW90aWNfcHJvcGh5bGF4aXMiLCAiTGF0ZV9vbnNldF9zZXBzaXMiICwgIk5lY3JvdGl6aW5nX2VudGVyb2NvbGl0aXMiLCAiUGF0ZW50X2R1Y3R1c19hcnRlcmlvc3VzIiwgIkJyb25jaG9wdWxtb25hcnlfZHlzcGxhc2lhIiwgIkFudGliaW90aWNzX2F0X2JpcnRoIiwgIlRvdGFsX2RheXNfYW50aWJpb3RpY3NfdGhlcmFweSIpKQ0KDQojY29sbmFtZXMoWSkgI0NoZWNrIHJlbWFpbmluZyBjb2x1bW5zDQoNCiMjI1NlbGVjdCBvbmx5IG51bWVyaWMgbWV0YWRhdGEgY3VsdW1ucw0KDQojWSAgPC0gWSAlPiUgbXV0YXRlX2FsbChhcy5udW1lcmljKQ0KDQojY29sbmFtZXMoWSkgI0NoZWNrIHJlbWFpbmluZyBjb2x1bW5zDQoNCiMjdmlmY29yDQojY29sbGluZWFyaXR5IDwtIHZpZmNvcihZLCB0aCAgPTAuNSkgI2F0IDAuNSB0aHJlc2hvbGQgdmFyaWFibGVzIGhhdmUgYSBWSUYgYmVsb3cgMTAuMDAgKDwwLjIxIGNvcnJlbGF0aW9uISkNCiNjb2xsaW5lYXJpdHkNCg0KI1NlbGVjdCByZWxldmFudCBjb2x1bW5zIGZvciB0aGF0IGFyZSBub24tY29sbGluZWFyDQoNClkuYWQgPSBZDQojWS5hZCA8LSBkcGx5cjo6c2VsZWN0KFkuYWxsLGMoIkJhdGNoIiwgIlRpbWUiKQ0KDQojWS5hZCA8LSBZLmFsbFs4OjIzXQ0KDQojUmVtb3ZlIE5BIHJvd3MNCg0KWS5hZCA8LSBZLmFkICU+JSBkcm9wX25hKCkNCg0KWC5hZCA8LSBYW3Jvd25hbWVzKFkuYWQpLF0NCg0KI2lzLm5hKFkuYWQpDQoNCiMjU3Vic2V0IGVhY2ggdGltZSBwb2ludA0KIyMjIDANClkuMCA8LSBkcGx5cjo6ZmlsdGVyKFkuYWQsIERheXMgPT0gIiAxIikNClguMCA8LSBYW3Jvd25hbWVzKFkuMCksXQ0KIyMjIDE1DQpZLjE1IDwtIGRwbHlyOjpmaWx0ZXIoWS5hZCwgRGF5cyA9PSAiMTUiKQ0KWC4xNSA8LSBYW3Jvd25hbWVzKFkuMTUpLF0NCg0KIyMjIDMwDQpZLjMwIDwtIGRwbHlyOjpmaWx0ZXIoWS5hZCwgRGF5cyA9PSAiMzAiKQ0KWC4zMCA8LSBYW3Jvd25hbWVzKFkuMzApLF0NCg0KIyMjIDkwDQpZLjkwIDwtIGRwbHlyOjpmaWx0ZXIoWS5hZCwgRGF5cyA9PSAiOTAiKQ0KWC45MCA8LSBYW3Jvd25hbWVzKFkuOTApLF0NCmBgYA0KDQojIyMgRGIgYW5vdmEgLSBjb25zdHJhaW5lZCBmb3IgdGltZSBwb2ludA0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KIyMjIyMjIyMjIyMjIyNBbm92YSBvbiBjYXBzY2FsZSAtIGFsbCB2YXJpYWJsZXMNCg0KYW5vdmEubSA8LSBtYXRyaXgobnJvdyA9IDAsIG5jb2wgPTYpICNDcmVhdGUgbWF0cml4IGZvciByZXN1bHRzDQpjb2xuYW1lcyhhbm92YS5tKSA8LSBjKCJEZiIsIlN1bU9mU3FzIiwiRiIsIlByLkYiLCJSZXNpZHVhbC5EZiIsIlJlc2lkdWFsLlN1bU9mU3FzIikgICAgICAgICAgICAgICAgDQpmb3IgKGkgaW4gY29sbmFtZXMoZHBseXI6OnNlbGVjdChZLmFkLC1jKCJEYXlzIikpKSl7DQogIGFub3ZhIDwtIGFzLm1hdHJpeChhbm92YS5jY2EoY2Fwc2NhbGUoWC5hZCB+IFkuYWRbLGldICsgQ29uZGl0aW9uKERheXMpLCBZLmFkLCBkaXN0ID0gImJyYXkiKSxwZXJtdXRhdGlvbnMgPSBob3cobnBlcm09OTk5OSkpKQ0KICBhbm92YSA8LSBjKGFub3ZhWzEsXSxhbm92YVsyLDE6Ml0pDQogIGFub3ZhLm0gPC1yYmluZChhbm92YS5tLGFub3ZhKQ0KfQ0KDQpyb3duYW1lcyhhbm92YS5tKSA8LSBjb2xuYW1lcyhkcGx5cjo6c2VsZWN0KFkuYWQsLWMoIkRheXMiKSkpDQoNCiNQcmVwYXJlIGZvciBwbG90dGluZw0KDQphbm92YS5kYXQgPC0gYW5vdmEubSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpICU+JQ0KICB0aWJibGU6OmFkZF9jb2x1bW4oVmFyaWFibGUgPSByb3duYW1lcyhhbm92YS5tKSwubmFtZV9yZXBhaXIgPSAibWluaW1hbCIpDQoNCiNBZGQgYWRqdXN0ZWQgcC12YWx1ZXMNCmFub3ZhLmRhdCRQci5GLmFkaiA8LSBwLmFkanVzdChhbm92YS5kYXQkUHIuRiwgbWV0aG9kID0gJ2hvbG0nKQ0KDQojU2hvdyB0YWJsZQ0KI2tuaXRyOjprYWJsZShhbm92YS5kYXQpDQoNCiNDYWxjdWxhdGUgc3VtIG9mIHNxdWFyZXMNCmFub3ZhLmRhdCRSMiA8LSBhbm92YS5kYXQkU3VtT2ZTcXMgLyAoYW5vdmEuZGF0JFN1bU9mU3FzICsgYW5vdmEuZGF0JFJlc2lkdWFsLlN1bU9mU3FzKQ0KDQojI0ZhbmN5IHBsb3QNCg0KYW5vdmEubWVsdCA8LSB0aWR5cjo6cGl2b3RfbG9uZ2VyKGFub3ZhLmRhdCxjb2xzPWMoIlIyIiksIG5hbWVzX3RvPSdtZWFzdXJlJywgdmFsdWVzX3RvPSJ2YWx1ZSIpICU+JQ0KICBhZGRfc2lnbmlmaWNhbmNlKHAuY29sID0gIlByLkYuYWRqIiwgb3V0cHV0LmNvbCA9ICJQckYuc3ltIiwNCiAgICAgICAgICAgICAgICAgICBjdXRwb2ludHMgPSBjKDAsIDFlLTA0LCAwLjAwMSwgMC4wMSwgMC4wNSwgMC4xLDEpLA0KICAgICAgICAgICAgICAgICAgIHN5bWJvbHMgPSBjKCIqKioqIiwgIioqKiIsICIqKiIsICIqIiwgIlx1MDJEOSIsICIiKQ0KICAgICAgICAgICAgICAgICAgICkgJT4lDQogIGFycmFuZ2UodmFsdWUpDQoNCmFub3ZhLm1lbHQudmlyIDwtIGFub3ZhLm1lbHQgJT4lIG11dGF0ZShWYXJpYWJsZSA9IGdzdWIoIl8iLCAiICIsVmFyaWFibGUpKQ0KDQpmYW5jeS5hbm92YS5iYXIudmlyIDwtIGdnYmFycGxvdChhbm92YS5tZWx0LnZpciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeD0iVmFyaWFibGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5PSJ2YWx1ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb2xvciA9ICJWYXJpYWJsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gYygiaG9yaXpvbnRhbCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IE5BLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gIm1lYXN1cmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGFub3ZhLm1lbHQkUHJGLnN5bSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiLnNpemUgPSA5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWIudmp1c3QgPSAwLjcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYi5oanVzdCA9IC0wLjMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQopICsNCiAgI3N0YXRfcHZhbHVlX21hbnVhbCgNCiAgIyAgYWRvbmlzLm1lbHQsICBsYWJlbCA9ICJQckYuc3ltIiwgdGlwLmxlbmd0aCA9IDAuMDENCiAgIykgKw0KICAjZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC4wNSkgKw0KICBnZ3RpdGxlKCJDYXBzY2FsZSBkYlJEQSBlZmZlY3Qgc2l6ZTogYWxsIHZhcmlhYmxlcyIpICsNCiAgeWxhYihleHByZXNzaW9uKFJeMn4idmFsdWUiKSkgKw0KICBzY2FsZV9maWxsX2pjbygpDQoNCmZhbmN5LmFub3ZhLmJhci52aXINCmBgYA0KDQoNCiMjIEhvc3Qgdmlyb21lDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRn0NCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjSW1wb3J0aW5nLURhdGENCg0KIyBzdGFuZGYgPSBmdW5jdGlvbih4LCB0PXRvdGFsKSByb3VuZCh0ICogKHggLyBzdW0oeCkpKQ0KIyB0b3RhbCA9IG1lZGlhbihzYW1wbGVfc3VtcyhQU1YpKQ0KIyBQU1YuaG9zdC5SQSA9IHRyYW5zZm9ybV9zYW1wbGVfY291bnRzKFBTVi5ob3N0LCBzdGFuZGYpDQoNCmltcG9ydC5vdHUudGFibGUgPC0gYXMuZGF0YS5mcmFtZShvdHVfdGFibGUoUFNWLmhvc3QpKSAlPiUNCiAgI2RwbHlyOjpzZWxlY3QoLXRheG9ub215KSAlPiUNCiAgbXV0YXRlX2FsbChhcy5udW1lcmljKSAjQ29udmVydCB0byBudW1lcmljIHdoZXJlIHBvc3NpYmxlIA0KDQpjdXJlLmRhdGEgPSBtZXRhLnZpcg0KDQojaW1wb3J0LnRheG9ub215ID0gcmVhZC50YWJsZSgndmlyb21lX3RheG9ub215X0xDQV9rbm93bi50eHQnLCBoZWFkZXIgPSBUKQ0KDQpyb3duYW1lcyA8LSByb3duYW1lcyhjdXJlLmRhdGEpDQoNCiNSZW1vdmUgTkEgY29sb21ucw0KDQpjdXJlLmRhdGEgPC0gY3VyZS5kYXRhWyAsICEgYXBwbHkoIGN1cmUuZGF0YSAsIDIgLCBmdW5jdGlvbih4KSBhbGwoaXMubmEoeCkpICkgXQ0KDQojU2V0IG51bWVyaWMgY29sdW1uIGNsYXNzDQpjdXJlLmRhdGEgPC0gY3VyZS5kYXRhICU+JSBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLGFzLmZhY3RvcikNCiNBZGQgYmFjayByb3duYW1lcw0KDQpyb3duYW1lcyhjdXJlLmRhdGEpIDwtIHJvd25hbWVzDQoNCiNjdXJlLmRhdGEgPC0gY3VyZS5kYXRhICU+JSBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5udW1lcmljKQ0KDQpYOC5ub25yYXJlZmllZCA9IHQoaW1wb3J0Lm90dS50YWJsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMlJSUgbm9uLXJhcmVmaWVkDQoNCg0KIyMjcmFyZWZ5aW5nfHN1YnNhbXBsaW5nIHJlYWRzIGluIGV2ZXJ5IHNhbXBsZQ0KYmFycGxvdChjb2xTdW1zKGltcG9ydC5vdHUudGFibGUpKQ0KbWluKGNvbFN1bXMoaW1wb3J0Lm90dS50YWJsZSkpDQoNCnJhcmU4IDwtIHQoaW1wb3J0Lm90dS50YWJsZSkNCiNyYXJlOCA9IHJhcmVmeSh0KGltcG9ydC5vdHUudGFibGUpLCBzYW1wbGUgPSA0NTAwMDApDQpYOC5yYXJlZmllZCA9IGFzLmRhdGEuZnJhbWUocmFyZTgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMlJSUgcmFyZWZpZWQNCg0KIyMjU3Vic2V0IG1ldGFkYXRhIHRvIG1hdGNoIHJlbWFpbmluZyBzYW1wbGVzIGFmdGVyIHJhcmVmYWN0aW9uDQoNClkuYWxsID0gY3VyZS5kYXRhW3Jvd25hbWVzKFg4LnJhcmVmaWVkKSxdDQoNCiMjI0xvZyB0cmFuZm9ybWF0aW9uDQpYID0gbG9nMTAoWDgucmFyZWZpZWQrMSkNCg0KI1NlbGVjdCByZWxldmFudCBudW1lcmljIGNvbHVtbg0KDQpZIDwtIGRwbHlyOjpzZWxlY3QoWS5hbGwsYygiVHdpbl9wYWlycyIsICJEYXlzIiwgIkdlc3RhdGlvbmFsX2FnZSIsICJCaXJ0aF93ZWlnaHQiLCAiU21hbGxfZm9yX2dlc3RhdGlvbmFsX2FnZSIsICJBbnRlbmF0YWxfc3Rlcm9pZHMiICwgIkRlbGl2ZXJ5X21vZGUiLCAiSW50cmFwYXJ0dW1fYW50aWJpb3RpY19wcm9waHlsYXhpcyIsICJMYXRlX29uc2V0X3NlcHNpcyIgLCAiTmVjcm90aXppbmdfZW50ZXJvY29saXRpcyIsICJQYXRlbnRfZHVjdHVzX2FydGVyaW9zdXMiLCAiQnJvbmNob3B1bG1vbmFyeV9keXNwbGFzaWEiLCAiQW50aWJpb3RpY3NfYXRfYmlydGgiLCAiVG90YWxfZGF5c19hbnRpYmlvdGljc190aGVyYXB5IikpDQoNCiNjb2xuYW1lcyhZKSAjQ2hlY2sgcmVtYWluaW5nIGNvbHVtbnMNCg0KIyMjU2VsZWN0IG9ubHkgbnVtZXJpYyBtZXRhZGF0YSBjdWx1bW5zDQoNCiNZICA8LSBZICU+JSBtdXRhdGVfYWxsKGFzLm51bWVyaWMpDQoNCiNjb2xuYW1lcyhZKSAjQ2hlY2sgcmVtYWluaW5nIGNvbHVtbnMNCg0KIyN2aWZjb3INCiNjb2xsaW5lYXJpdHkgPC0gdmlmY29yKFksIHRoICA9MC41KSAjYXQgMC41IHRocmVzaG9sZCB2YXJpYWJsZXMgaGF2ZSBhIFZJRiBiZWxvdyAxMC4wMCAoPDAuMjEgY29ycmVsYXRpb24hKQ0KI2NvbGxpbmVhcml0eQ0KDQojU2VsZWN0IHJlbGV2YW50IGNvbHVtbnMgZm9yIHRoYXQgYXJlIG5vbi1jb2xsaW5lYXINCg0KWS5hZCA9IFkNCiNZLmFkIDwtIGRwbHlyOjpzZWxlY3QoWS5hbGwsYygiQmF0Y2giLCAiVGltZSIpDQoNCiNZLmFkIDwtIFkuYWxsWzg6MjNdDQoNCiNSZW1vdmUgTkEgcm93cw0KDQpZLmFkIDwtIFkuYWQgJT4lIGRyb3BfbmEoKQ0KDQpYLmFkIDwtIFhbcm93bmFtZXMoWS5hZCksXQ0KDQojaXMubmEoWS5hZCkNCg0KIyNTdWJzZXQgZWFjaCB0aW1lIHBvaW50DQojIyMgMA0KWS4wIDwtIGRwbHlyOjpmaWx0ZXIoWS5hZCwgRGF5cyA9PSAiIDEiKQ0KWC4wIDwtIFhbcm93bmFtZXMoWS4wKSxdDQojIyMgMTUNClkuMTUgPC0gZHBseXI6OmZpbHRlcihZLmFkLCBEYXlzID09ICIxNSIpDQpYLjE1IDwtIFhbcm93bmFtZXMoWS4xNSksXQ0KDQojIyMgMzANClkuMzAgPC0gZHBseXI6OmZpbHRlcihZLmFkLCBEYXlzID09ICIzMCIpDQpYLjMwIDwtIFhbcm93bmFtZXMoWS4zMCksXQ0KDQojIyMgOTANClkuOTAgPC0gZHBseXI6OmZpbHRlcihZLmFkLCBEYXlzID09ICI5MCIpDQpYLjkwIDwtIFhbcm93bmFtZXMoWS45MCksXQ0KYGBgDQoNCiMjIyBEYiBhbm92YSAtIGNvbnN0cmFpbmVkIGZvciB0aW1lIHBvaW50DQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQojIyMjIyMjIyMjIyMjI0Fub3ZhIG9uIGNhcHNjYWxlIC0gYWxsIHZhcmlhYmxlcw0KDQphbm92YS5tIDwtIG1hdHJpeChucm93ID0gMCwgbmNvbCA9NikgI0NyZWF0ZSBtYXRyaXggZm9yIHJlc3VsdHMNCmNvbG5hbWVzKGFub3ZhLm0pIDwtIGMoIkRmIiwiU3VtT2ZTcXMiLCJGIiwiUHIuRiIsIlJlc2lkdWFsLkRmIiwiUmVzaWR1YWwuU3VtT2ZTcXMiKSAgICAgICAgICAgICAgICANCmZvciAoaSBpbiBjb2xuYW1lcyhkcGx5cjo6c2VsZWN0KFkuYWQsLWMoIkRheXMiKSkpKXsNCiAgYW5vdmEgPC0gYXMubWF0cml4KGFub3ZhLmNjYShjYXBzY2FsZShYLmFkIH4gWS5hZFssaV0gKyBDb25kaXRpb24oRGF5cyksIFkuYWQsIGRpc3QgPSAiYnJheSIpLHBlcm11dGF0aW9ucyA9IGhvdyhucGVybT05OTk5KSkpDQogIGFub3ZhIDwtIGMoYW5vdmFbMSxdLGFub3ZhWzIsMToyXSkNCiAgYW5vdmEubSA8LXJiaW5kKGFub3ZhLm0sYW5vdmEpDQp9DQoNCnJvd25hbWVzKGFub3ZhLm0pIDwtIGNvbG5hbWVzKGRwbHlyOjpzZWxlY3QoWS5hZCwtYygiRGF5cyIpKSkNCg0KI1ByZXBhcmUgZm9yIHBsb3R0aW5nDQoNCmFub3ZhLmRhdCA8LSBhbm92YS5tICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogIHRpYmJsZTo6YWRkX2NvbHVtbihWYXJpYWJsZSA9IHJvd25hbWVzKGFub3ZhLm0pLC5uYW1lX3JlcGFpciA9ICJtaW5pbWFsIikNCg0KI0FkZCBhZGp1c3RlZCBwLXZhbHVlcw0KYW5vdmEuZGF0JFByLkYuYWRqIDwtIHAuYWRqdXN0KGFub3ZhLmRhdCRQci5GLCBtZXRob2QgPSAnaG9sbScpDQoNCiNTaG93IHRhYmxlDQoja25pdHI6OmthYmxlKGFub3ZhLmRhdCkNCg0KI0NhbGN1bGF0ZSBzdW0gb2Ygc3F1YXJlcw0KYW5vdmEuZGF0JFIyIDwtIGFub3ZhLmRhdCRTdW1PZlNxcyAvIChhbm92YS5kYXQkU3VtT2ZTcXMgKyBhbm92YS5kYXQkUmVzaWR1YWwuU3VtT2ZTcXMpDQoNCiMjRmFuY3kgcGxvdA0KDQphbm92YS5tZWx0IDwtIHRpZHlyOjpwaXZvdF9sb25nZXIoYW5vdmEuZGF0LGNvbHM9YygiUjIiKSwgbmFtZXNfdG89J21lYXN1cmUnLCB2YWx1ZXNfdG89InZhbHVlIikgJT4lDQogIGFkZF9zaWduaWZpY2FuY2UocC5jb2wgPSAiUHIuRi5hZGoiLCBvdXRwdXQuY29sID0gIlByRi5zeW0iLA0KICAgICAgICAgICAgICAgICAgIGN1dHBvaW50cyA9IGMoMCwgMWUtMDQsIDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEsMSksDQogICAgICAgICAgICAgICAgICAgc3ltYm9scyA9IGMoIioqKioiLCAiKioqIiwgIioqIiwgIioiLCAiXHUwMkQ5IiwgIiIpDQogICAgICAgICAgICAgICAgICAgKSAlPiUNCiAgYXJyYW5nZSh2YWx1ZSkNCg0KYW5vdmEubWVsdC52aXIuaG9zdCA8LSBhbm92YS5tZWx0ICU+JSBtdXRhdGUoVmFyaWFibGUgPSBnc3ViKCJfIiwgIiAiLFZhcmlhYmxlKSkNCg0KZmFuY3kuYW5vdmEuYmFyLnZpci5ob3N0IDwtIGdnYmFycGxvdChhbm92YS5tZWx0LnZpci5ob3N0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4PSJWYXJpYWJsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9InZhbHVlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NvbG9yID0gIlZhcmlhYmxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSBjKCJob3Jpem9udGFsIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gTkEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSAibWVhc3VyZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gYW5vdmEubWVsdCRQckYuc3ltLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWIuc2l6ZSA9IDksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYi52anVzdCA9IDAuNywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiLmhqdXN0ID0gLTAuMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCikgKw0KICAjc3RhdF9wdmFsdWVfbWFudWFsKA0KICAjICBhZG9uaXMubWVsdCwgIGxhYmVsID0gIlByRi5zeW0iLCB0aXAubGVuZ3RoID0gMC4wMQ0KICAjKSArDQogICNnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjA1KSArDQogIGdndGl0bGUoIkNhcHNjYWxlIGRiUkRBIGVmZmVjdCBzaXplOiBhbGwgdmFyaWFibGVzIikgKw0KICB5bGFiKGV4cHJlc3Npb24oUl4yfiJ2YWx1ZSIpKSArDQogIHNjYWxlX2ZpbGxfamNvKCkNCg0KZmFuY3kuYW5vdmEuYmFyLnZpci5ob3N0DQpgYGANCg0KIyMgSG9zdCB2aXJvbWUgLSBHZW51cw0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEZ9DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI0ltcG9ydGluZy1EYXRhDQoNCiMgc3RhbmRmID0gZnVuY3Rpb24oeCwgdD10b3RhbCkgcm91bmQodCAqICh4IC8gc3VtKHgpKSkNCiMgdG90YWwgPSBtZWRpYW4oc2FtcGxlX3N1bXMoUFNWKSkNCiMgUFNWLmhvc3QuUkEgPSB0cmFuc2Zvcm1fc2FtcGxlX2NvdW50cyhQU1YuaG9zdCwgc3RhbmRmKQ0KDQpQU1YuQ1NTLmhvc3QuZ2VudXMgPC0gdGF4X2dsb20oUFNWLmhvc3QsdGF4cmFuayA9ICJHZW51cyIpDQoNCmltcG9ydC5vdHUudGFibGUgPC0gYXMuZGF0YS5mcmFtZShvdHVfdGFibGUoUFNWLkNTUy5ob3N0LmdlbnVzKSkgJT4lDQogICNkcGx5cjo6c2VsZWN0KC10YXhvbm9teSkgJT4lDQogIG11dGF0ZV9hbGwoYXMubnVtZXJpYykgI0NvbnZlcnQgdG8gbnVtZXJpYyB3aGVyZSBwb3NzaWJsZSANCg0KY3VyZS5kYXRhID0gbWV0YS52aXINCg0KI2ltcG9ydC50YXhvbm9teSA9IHJlYWQudGFibGUoJ3Zpcm9tZV90YXhvbm9teV9MQ0Ffa25vd24udHh0JywgaGVhZGVyID0gVCkNCg0Kcm93bmFtZXMgPC0gcm93bmFtZXMoY3VyZS5kYXRhKQ0KDQojUmVtb3ZlIE5BIGNvbG9tbnMNCg0KY3VyZS5kYXRhIDwtIGN1cmUuZGF0YVsgLCAhIGFwcGx5KCBjdXJlLmRhdGEgLCAyICwgZnVuY3Rpb24oeCkgYWxsKGlzLm5hKHgpKSApIF0NCg0KI1NldCBudW1lcmljIGNvbHVtbiBjbGFzcw0KY3VyZS5kYXRhIDwtIGN1cmUuZGF0YSAlPiUgbXV0YXRlX2lmKGlzLmNoYXJhY3Rlcixhcy5mYWN0b3IpDQojQWRkIGJhY2sgcm93bmFtZXMNCg0Kcm93bmFtZXMoY3VyZS5kYXRhKSA8LSByb3duYW1lcw0KDQojY3VyZS5kYXRhIDwtIGN1cmUuZGF0YSAlPiUgbXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgYXMubnVtZXJpYykNCg0KWDgubm9ucmFyZWZpZWQgPSB0KGltcG9ydC5vdHUudGFibGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjJSUlIG5vbi1yYXJlZmllZA0KDQoNCiMjI3JhcmVmeWluZ3xzdWJzYW1wbGluZyByZWFkcyBpbiBldmVyeSBzYW1wbGUNCmJhcnBsb3QoY29sU3VtcyhpbXBvcnQub3R1LnRhYmxlKSkNCm1pbihjb2xTdW1zKGltcG9ydC5vdHUudGFibGUpKQ0KDQpyYXJlOCA8LSB0KGltcG9ydC5vdHUudGFibGUpDQojcmFyZTggPSByYXJlZnkodChpbXBvcnQub3R1LnRhYmxlKSwgc2FtcGxlID0gNDUwMDAwKQ0KWDgucmFyZWZpZWQgPSBhcy5kYXRhLmZyYW1lKHJhcmU4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjJSUlIHJhcmVmaWVkDQoNCiMjI1N1YnNldCBtZXRhZGF0YSB0byBtYXRjaCByZW1haW5pbmcgc2FtcGxlcyBhZnRlciByYXJlZmFjdGlvbg0KDQpZLmFsbCA9IGN1cmUuZGF0YVtyb3duYW1lcyhYOC5yYXJlZmllZCksXQ0KDQojIyNMb2cgdHJhbmZvcm1hdGlvbg0KWCA9IGxvZzEwKFg4LnJhcmVmaWVkKzEpDQoNCiNTZWxlY3QgcmVsZXZhbnQgbnVtZXJpYyBjb2x1bW4NCg0KWSA8LSBkcGx5cjo6c2VsZWN0KFkuYWxsLGMoIlR3aW5fcGFpcnMiLCAiRGF5cyIsICJHZXN0YXRpb25hbF9hZ2UiLCAiQmlydGhfd2VpZ2h0IiwgIlNtYWxsX2Zvcl9nZXN0YXRpb25hbF9hZ2UiLCAiQW50ZW5hdGFsX3N0ZXJvaWRzIiAsICJEZWxpdmVyeV9tb2RlIiwgIkludHJhcGFydHVtX2FudGliaW90aWNfcHJvcGh5bGF4aXMiLCAiTGF0ZV9vbnNldF9zZXBzaXMiICwgIk5lY3JvdGl6aW5nX2VudGVyb2NvbGl0aXMiLCAiUGF0ZW50X2R1Y3R1c19hcnRlcmlvc3VzIiwgIkJyb25jaG9wdWxtb25hcnlfZHlzcGxhc2lhIiwgIkFudGliaW90aWNzX2F0X2JpcnRoIiwgIlRvdGFsX2RheXNfYW50aWJpb3RpY3NfdGhlcmFweSIpKQ0KDQpjb2xuYW1lcyhZKSAjQ2hlY2sgcmVtYWluaW5nIGNvbHVtbnMNCg0KIyMjU2VsZWN0IG9ubHkgbnVtZXJpYyBtZXRhZGF0YSBjdWx1bW5zDQoNCiNZICA8LSBZICU+JSBtdXRhdGVfYWxsKGFzLm51bWVyaWMpDQoNCiNjb2xuYW1lcyhZKSAjQ2hlY2sgcmVtYWluaW5nIGNvbHVtbnMNCg0KIyN2aWZjb3INCiNjb2xsaW5lYXJpdHkgPC0gdmlmY29yKFksIHRoICA9MC41KSAjYXQgMC41IHRocmVzaG9sZCB2YXJpYWJsZXMgaGF2ZSBhIFZJRiBiZWxvdyAxMC4wMCAoPDAuMjEgY29ycmVsYXRpb24hKQ0KI2NvbGxpbmVhcml0eQ0KDQojU2VsZWN0IHJlbGV2YW50IGNvbHVtbnMgZm9yIHRoYXQgYXJlIG5vbi1jb2xsaW5lYXINCg0KWS5hZCA9IFkNCiNZLmFkIDwtIGRwbHlyOjpzZWxlY3QoWS5hbGwsYygiQmF0Y2giLCAiVGltZSIpDQoNCiNZLmFkIDwtIFkuYWxsWzg6MjNdDQoNCiNSZW1vdmUgTkEgcm93cw0KDQpZLmFkIDwtIFkuYWQgJT4lIGRyb3BfbmEoKQ0KDQpYLmFkIDwtIFhbcm93bmFtZXMoWS5hZCksXQ0KDQojaXMubmEoWS5hZCkNCg0KIyNTdWJzZXQgZWFjaCB0aW1lIHBvaW50DQojIyMgMA0KWS4wIDwtIGRwbHlyOjpmaWx0ZXIoWS5hZCwgRGF5cyA9PSAiIDEiKQ0KWC4wIDwtIFhbcm93bmFtZXMoWS4wKSxdDQojIyMgMTUNClkuMTUgPC0gZHBseXI6OmZpbHRlcihZLmFkLCBEYXlzID09ICIxNSIpDQpYLjE1IDwtIFhbcm93bmFtZXMoWS4xNSksXQ0KDQojIyMgMzANClkuMzAgPC0gZHBseXI6OmZpbHRlcihZLmFkLCBEYXlzID09ICIzMCIpDQpYLjMwIDwtIFhbcm93bmFtZXMoWS4zMCksXQ0KDQojIyMgOTANClkuOTAgPC0gZHBseXI6OmZpbHRlcihZLmFkLCBEYXlzID09ICI5MCIpDQpYLjkwIDwtIFhbcm93bmFtZXMoWS45MCksXQ0KYGBgDQoNCiMjIyBEYiBhbm92YSAtIGNvbnN0cmFpbmVkIGZvciB0aW1lIHBvaW50DQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQojIyMjIyMjIyMjIyMjI0Fub3ZhIG9uIGNhcHNjYWxlIC0gYWxsIHZhcmlhYmxlcw0KDQphbm92YS5tIDwtIG1hdHJpeChucm93ID0gMCwgbmNvbCA9NikgI0NyZWF0ZSBtYXRyaXggZm9yIHJlc3VsdHMNCmNvbG5hbWVzKGFub3ZhLm0pIDwtIGMoIkRmIiwiU3VtT2ZTcXMiLCJGIiwiUHIuRiIsIlJlc2lkdWFsLkRmIiwiUmVzaWR1YWwuU3VtT2ZTcXMiKSAgICAgICAgICAgICAgICANCmZvciAoaSBpbiBjb2xuYW1lcyhkcGx5cjo6c2VsZWN0KFkuYWQsLWMoIkRheXMiKSkpKXsNCiAgYW5vdmEgPC0gYXMubWF0cml4KGFub3ZhLmNjYShjYXBzY2FsZShYLmFkIH4gWS5hZFssaV0gKyBDb25kaXRpb24oRGF5cyksIFkuYWQsIGRpc3QgPSAiYnJheSIpLHBlcm11dGF0aW9ucyA9IGhvdyhucGVybT05OTk5KSkpDQogIGFub3ZhIDwtIGMoYW5vdmFbMSxdLGFub3ZhWzIsMToyXSkNCiAgYW5vdmEubSA8LXJiaW5kKGFub3ZhLm0sYW5vdmEpDQp9DQoNCnJvd25hbWVzKGFub3ZhLm0pIDwtIGNvbG5hbWVzKGRwbHlyOjpzZWxlY3QoWS5hZCwtYygiRGF5cyIpKSkNCg0KI1ByZXBhcmUgZm9yIHBsb3R0aW5nDQoNCmFub3ZhLmRhdCA8LSBhbm92YS5tICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogIHRpYmJsZTo6YWRkX2NvbHVtbihWYXJpYWJsZSA9IHJvd25hbWVzKGFub3ZhLm0pLC5uYW1lX3JlcGFpciA9ICJtaW5pbWFsIikNCg0KI0FkZCBhZGp1c3RlZCBwLXZhbHVlcw0KYW5vdmEuZGF0JFByLkYuYWRqIDwtIHAuYWRqdXN0KGFub3ZhLmRhdCRQci5GLCBtZXRob2QgPSAnaG9sbScpDQoNCiNTaG93IHRhYmxlDQoja25pdHI6OmthYmxlKGFub3ZhLmRhdCkNCg0KI0NhbGN1bGF0ZSBzdW0gb2Ygc3F1YXJlcw0KYW5vdmEuZGF0JFIyIDwtIGFub3ZhLmRhdCRTdW1PZlNxcyAvIChhbm92YS5kYXQkU3VtT2ZTcXMgKyBhbm92YS5kYXQkUmVzaWR1YWwuU3VtT2ZTcXMpDQoNCiMjRmFuY3kgcGxvdA0KDQphbm92YS5tZWx0IDwtIHRpZHlyOjpwaXZvdF9sb25nZXIoYW5vdmEuZGF0LGNvbHM9YygiUjIiKSwgbmFtZXNfdG89J21lYXN1cmUnLCB2YWx1ZXNfdG89InZhbHVlIikgJT4lDQogIGFkZF9zaWduaWZpY2FuY2UocC5jb2wgPSAiUHIuRi5hZGoiLCBvdXRwdXQuY29sID0gIlByRi5zeW0iLA0KICAgICAgICAgICAgICAgICAgIGN1dHBvaW50cyA9IGMoMCwgMWUtMDQsIDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEsMSksDQogICAgICAgICAgICAgICAgICAgc3ltYm9scyA9IGMoIioqKioiLCAiKioqIiwgIioqIiwgIioiLCAiXHUwMkQ5IiwgIiIpDQogICAgICAgICAgICAgICAgICAgKSAlPiUNCiAgYXJyYW5nZSh2YWx1ZSkNCg0KYW5vdmEubWVsdC52aXIuaG9zdCA8LSBhbm92YS5tZWx0ICU+JSBtdXRhdGUoVmFyaWFibGUgPSBnc3ViKCJfIiwgIiAiLFZhcmlhYmxlKSkNCg0KZmFuY3kuYW5vdmEuYmFyLnZpci5ob3N0IDwtIGdnYmFycGxvdChhbm92YS5tZWx0LnZpci5ob3N0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4PSJWYXJpYWJsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9InZhbHVlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NvbG9yID0gIlZhcmlhYmxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSBjKCJob3Jpem9udGFsIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gTkEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSAibWVhc3VyZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gYW5vdmEubWVsdCRQckYuc3ltLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWIuc2l6ZSA9IDksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYi52anVzdCA9IDAuNywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiLmhqdXN0ID0gLTAuMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCikgKw0KICAjc3RhdF9wdmFsdWVfbWFudWFsKA0KICAjICBhZG9uaXMubWVsdCwgIGxhYmVsID0gIlByRi5zeW0iLCB0aXAubGVuZ3RoID0gMC4wMQ0KICAjKSArDQogICNnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjA1KSArDQogIGdndGl0bGUoIkNhcHNjYWxlIGRiUkRBIGVmZmVjdCBzaXplOiBhbGwgdmFyaWFibGVzIikgKw0KICB5bGFiKGV4cHJlc3Npb24oUl4yfiJ2YWx1ZSIpKSArDQogIHNjYWxlX2ZpbGxfamNvKCkNCg0KZmFuY3kuYW5vdmEuYmFyLnZpci5ob3N0DQpgYGANCg0KIyMgQ29tYmluZWQgZWZmZWN0IHNpemUgcGxvdHMNCg0KIyMjIFdpdGggdmlyYWwgaG9zdHMNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTZ9DQphbm92YS5tZWx0LmJhYyRDb21tdW5pdHkgPC0gIkJhY3RlcmlhIg0KYW5vdmEubWVsdC52aXIkQ29tbXVuaXR5IDwtICJWaXJhIg0KYW5vdmEubWVsdC52aXIuaG9zdCRDb21tdW5pdHkgPC0gIlZpcmFsIGhvc3QiDQoNCiMgUmVuYW1lIHZhcmlhYmxlcw0KDQphbm92YS5tZWx0LmNvbWIgPC0gcmJpbmQoYW5vdmEubWVsdC5iYWMsYW5vdmEubWVsdC52aXIsYW5vdmEubWVsdC52aXIuaG9zdCkNCg0KYW5vdmEubWVsdC5jb21iJFZhcmlhYmxlLmNsZWFuIDwtIGdzdWIoIl8iLCIgIixhbm92YS5tZWx0LmNvbWIkVmFyaWFibGUpDQoNCg0KZmFuY3kuYW5vdmEuYmFyLmNvbWIuaG9zdCA8LSBnZ2JhcnBsb3QoYW5vdmEubWVsdC5jb21iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4PSJWYXJpYWJsZS5jbGVhbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9InZhbHVlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxhYiA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gIkNvbW11bml0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gYygiaG9yaXpvbnRhbCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZmlsbCA9ICJtZWFzdXJlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44NSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gYW5vdmEubWVsdCRQckYuc3ltLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWIuc2l6ZSA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYi52anVzdCA9IDAuOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiLmhqdXN0ID0gLTAuMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCikgKw0KICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X3RleHQoYW5nbGUgPSA0NSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAuMSwgMC4yLCAwLjcsIDAuMSksICJpbmNoZXMiKSkgKw0KICB5bGFiKGV4cHJlc3Npb24oUl4yfiJ2YWx1ZSIpKSArDQogIHNjYWxlX2ZpbGxfamNvKCkNCg0KZmFuY3kuYW5vdmEuYmFyLmNvbWIuaG9zdA0KDQpgYGANCg0KIyMjIEJhY3RlcmlhIHZzIHZpcmEgb25seQ0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9Nn0NCg0KDQphbm92YS5tZWx0LmJhYyRDb21tdW5pdHkgPC0gIkJhY3RlcmlhIg0KYW5vdmEubWVsdC52aXIkQ29tbXVuaXR5IDwtICJWaXJhIg0KDQojIFJlbmFtZSB2YXJpYWJsZXMNCg0KYW5vdmEubWVsdC5jb21iIDwtIHJiaW5kKGFub3ZhLm1lbHQuYmFjLGFub3ZhLm1lbHQudmlyKQ0KDQphbm92YS5tZWx0LmNvbWIkVmFyaWFibGUuY2xlYW4gPC0gZ3N1YigiXyIsIiAiLGFub3ZhLm1lbHQuY29tYiRWYXJpYWJsZSkNCg0KDQpmYW5jeS5hbm92YS5iYXIuY29tYiA8LSBnZ2JhcnBsb3QoYW5vdmEubWVsdC5jb21iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4PSJWYXJpYWJsZS5jbGVhbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9InZhbHVlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsYWIgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJDb21tdW5pdHkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IGMoImhvcml6b250YWwiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2ZpbGwgPSAibWVhc3VyZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gYW5vdmEubWVsdCRQckYuc3ltLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWIuc2l6ZSA9IDcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYi52anVzdCA9IDAuOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiLmhqdXN0ID0gLTAuMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCikgKw0KICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X3RleHQoYW5nbGUgPSA0NSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAuMSwgMC4yLCAwLjcsIDAuMSksICJpbmNoZXMiKSkgKw0KICB5bGFiKGV4cHJlc3Npb24oUl4yfiJ2YWx1ZSIpKSArDQogIHNjYWxlX2ZpbGxfamNvKCkNCg0KZmFuY3kuYW5vdmEuYmFyLmNvbWINCg0KYGBgDQoNCiMgUmFidXBsb3QNCg0KIyMgVGltZQ0KDQpgYGB7ciwgbWVzc2FnZSA9IEZ9DQojcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoImpzdG9raG9sbS9yYWJ1cGxvdCIpDQpsaWJyYXJ5KHJhYnVwbG90KQ0KDQpQU1YuaG9zdEBzYW1fZGF0YSREYXlzIDwtIGZhY3RvcihQU1YuaG9zdEBzYW1fZGF0YSREYXlzLCBsZXZlbHMgPSBjKCI5MCIsIjYwIiwiMzAiLCIxNSIsIjEiKSkNClBTQkBzYW1fZGF0YSREYXlzIDwtIGZhY3RvcihQU0JAc2FtX2RhdGEkRGF5cywgbGV2ZWxzID0gYygiOTAiLCI2MCIsIjMwIiwiMTUiLCIxIikpDQoNCnJhYnUudmlyIDwtIHJhYnVwbG90KA0KICBQU1YuaG9zdCwNCiAgdmlvbGluID0gVFJVRSwgcHJlZGljdG9yID0gIkRheXMiLCBwX2FkanVzdCA9IFRSVUUsIE5fdGF4YSA9IDEwLCBjb2xvcnMgPSBjb2xfZmlsWzE6NF0pICsNCiAgZ2d0aXRsZSgiVmlyYWwgaG9zdHMiKQ0KDQpyYWJ1LmJhYyA8LSByYWJ1cGxvdCgNCiAgUFNCLA0KICB2aW9saW4gPSBUUlVFLCBwcmVkaWN0b3IgPSAiRGF5cyIsIHBfYWRqdXN0ID0gVFJVRSwgTl90YXhhID0gMTAsIGNvbG9ycyA9IGNvbF9maWxbMTo0XSkgKw0KICAjdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGdndGl0bGUoIkJhY3RlcmlhIikNCg0KZ2dhcnJhbmdlKHJhYnUuYmFjLHJhYnUudmlyLCBjb21tb24ubGVnZW5kID0gVFJVRSwgbGVnZW5kID0gImJvdHRvbSIpDQpgYGANCg0KIyMgQnJvbmNob3B1bG1vbmFyeV9keXNwbGFzaWENCg0KYGBge3IsIG1lc3NhZ2UgPSBGfQ0KI3JlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJqc3Rva2hvbG0vcmFidXBsb3QiKQ0KbGlicmFyeShyYWJ1cGxvdCkNCg0KcmFidS52aXIuYnBkIDwtIHJhYnVwbG90KA0KICBQU1YuaG9zdCwNCiAgdmlvbGluID0gVFJVRSwgcHJlZGljdG9yID0gIkJyb25jaG9wdWxtb25hcnlfZHlzcGxhc2lhIiwgcF9hZGp1c3QgPSBUUlVFLCBOX3RheGEgPSAxMCwgY29sb3JzID0gY29sX2ZpbFsxOjJdKSArDQogIGdndGl0bGUoIlZpcmFsIGhvc3RzIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldikNCg0KcmFidS5iYWMuYnBkIDwtIHJhYnVwbG90KA0KICBQU0IsDQogIHZpb2xpbiA9IFRSVUUsIHByZWRpY3RvciA9ICJCcm9uY2hvcHVsbW9uYXJ5X2R5c3BsYXNpYSIsIHBfYWRqdXN0ID0gVFJVRSwgTl90YXhhID0gMTAsIGNvbG9ycyA9IGNvbF9maWxbMToyXSkgKw0KICAjdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGdndGl0bGUoIkJhY3RlcmlhIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldikNCg0KZ2dhcnJhbmdlKHJhYnUuYmFjLmJwZCxyYWJ1LnZpci5icGQsIGNvbW1vbi5sZWdlbmQgPSBUUlVFLCBsZWdlbmQgPSAiYm90dG9tIikNCmBgYA0KDQojIyBJbnRyYXBhcnR1bSBhbnRpYmlvdGljcw0KDQpgYGB7ciwgbWVzc2FnZSA9IEZ9DQojcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoImpzdG9raG9sbS9yYWJ1cGxvdCIpDQpsaWJyYXJ5KHJhYnVwbG90KQ0KDQpyYWJ1LnZpci50ZGFiIDwtIHJhYnVwbG90KA0KICBQU1YuaG9zdCwNCiAgdmlvbGluID0gVFJVRSwgcHJlZGljdG9yID0gIkludHJhcGFydHVtX2FudGliaW90aWNfcHJvcGh5bGF4aXMiLCBwX2FkanVzdCA9IFRSVUUsIE5fdGF4YSA9IDEwLCBjb2xvcnMgPSBjb2xfZmlsWzE6M10pICsNCiAgZ2d0aXRsZSgiVmlyYWwgaG9zdHMiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KQ0KDQpyYWJ1LmJhYy50ZGFiIDwtIHJhYnVwbG90KA0KICBQU0IsDQogIHZpb2xpbiA9IFRSVUUsIHByZWRpY3RvciA9ICJJbnRyYXBhcnR1bV9hbnRpYmlvdGljX3Byb3BoeWxheGlzIiwgcF9hZGp1c3QgPSBUUlVFLCBOX3RheGEgPSAxMCwgY29sb3JzID0gY29sX2ZpbFsxOjNdKSArDQogICN0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgZ2d0aXRsZSgiQmFjdGVyaWEiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KQ0KDQpnZ2FycmFuZ2UocmFidS5iYWMudGRhYixyYWJ1LnZpci50ZGFiLCBjb21tb24ubGVnZW5kID0gVFJVRSwgbGVnZW5kID0gImJvdHRvbSIpDQpgYGANCg0KIyMgVG90YWwgZGF5cyBhbnRpYmlvdGljcyB0cmVhdG1lbnQNCg0KYGBge3IsIG1lc3NhZ2UgPSBGfQ0KI3JlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJqc3Rva2hvbG0vcmFidXBsb3QiKQ0KbGlicmFyeShyYWJ1cGxvdCkNCg0KcmFidS52aXIuaWFwIDwtIHJhYnVwbG90KA0KICBQU1YuaG9zdCwNCiAgdmlvbGluID0gVFJVRSwgcHJlZGljdG9yID0gIlRvdGFsX2RheXNfYW50aWJpb3RpY3NfdGhlcmFweSIsIHBfYWRqdXN0ID0gVFJVRSwgTl90YXhhID0gMTAsIGNvbG9ycyA9IGNvbF9maWxbMTozXSkgKw0KICBnZ3RpdGxlKCJWaXJhbCBob3N0cyIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSByZXYpDQoNCnJhYnUuYmFjLmlhcCA8LSByYWJ1cGxvdCgNCiAgUFNCLA0KICB2aW9saW4gPSBUUlVFLCBwcmVkaWN0b3IgPSAiVG90YWxfZGF5c19hbnRpYmlvdGljc190aGVyYXB5IiwgcF9hZGp1c3QgPSBUUlVFLCBOX3RheGEgPSAxMCwgY29sb3JzID0gY29sX2ZpbFsxOjNdKSArDQogICN0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgZ2d0aXRsZSgiQmFjdGVyaWEiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KQ0KDQpnZ2FycmFuZ2UocmFidS5iYWMuaWFwLHJhYnUudmlyLmlhcCwgY29tbW9uLmxlZ2VuZCA9IFRSVUUsIGxlZ2VuZCA9ICJib3R0b20iKQ0KYGBgDQoNCiMjIEFudGliaW90aWNzIGF0IGJpcnRoDQoNCmBgYHtyLCBtZXNzYWdlID0gRn0NCiNyZW1vdGVzOjppbnN0YWxsX2dpdGh1YigianN0b2tob2xtL3JhYnVwbG90IikNCmxpYnJhcnkocmFidXBsb3QpDQoNCnJhYnUudmlyLnRkYWIgPC0gcmFidXBsb3QoDQogIFBTVi5ob3N0LA0KICB2aW9saW4gPSBUUlVFLCBwcmVkaWN0b3IgPSAiQW50aWJpb3RpY3NfYXRfYmlydGgiLCBwX2FkanVzdCA9IFRSVUUsIE5fdGF4YSA9IDEwLCBjb2xvcnMgPSBjb2xfZmlsWzE6M10pICsNCiAgZ2d0aXRsZSgiVmlyYWwgaG9zdHMiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KQ0KDQpyYWJ1LmJhYy50ZGFiIDwtIHJhYnVwbG90KA0KICBQU0IsDQogIHZpb2xpbiA9IFRSVUUsIHByZWRpY3RvciA9ICJBbnRpYmlvdGljc19hdF9iaXJ0aCIsIHBfYWRqdXN0ID0gVFJVRSwgTl90YXhhID0gMTAsIGNvbG9ycyA9IGNvbF9maWxbMTozXSkgKw0KICAjdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGdndGl0bGUoIkJhY3RlcmlhIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldikNCg0KZ2dhcnJhbmdlKHJhYnUuYmFjLnRkYWIscmFidS52aXIudGRhYiwgY29tbW9uLmxlZ2VuZCA9IFRSVUUsIGxlZ2VuZCA9ICJib3R0b20iKQ0KYGBgDQoNCiMjIFNtYWxsIGZvciBnZXN0YXRpb25hbCBhZ2UNCg0KYGBge3IsIG1lc3NhZ2UgPSBGfQ0KI3JlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJqc3Rva2hvbG0vcmFidXBsb3QiKQ0KbGlicmFyeShyYWJ1cGxvdCkNCg0KcmFidS52aXIuc2dhIDwtIHJhYnVwbG90KA0KICBQU1YuaG9zdCwNCiAgdmlvbGluID0gVFJVRSwgcHJlZGljdG9yID0gIlNtYWxsX2Zvcl9nZXN0YXRpb25hbF9hZ2UiLCBwX2FkanVzdCA9IFRSVUUsIE5fdGF4YSA9IDEwLCBjb2xvcnMgPSBjb2xfZmlsWzE6Ml0pICsNCiAgZ2d0aXRsZSgiVmlyYWwgaG9zdHMiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KQ0KDQpyYWJ1LmJhYy5zZ2EgPC0gcmFidXBsb3QoDQogIFBTQiwNCiAgdmlvbGluID0gVFJVRSwgcHJlZGljdG9yID0gIlNtYWxsX2Zvcl9nZXN0YXRpb25hbF9hZ2UiLCBwX2FkanVzdCA9IFRSVUUsIE5fdGF4YSA9IDEwLCBjb2xvcnMgPSBjb2xfZmlsWzE6Ml0pICsNCiAgI3RoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBnZ3RpdGxlKCJCYWN0ZXJpYSIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSByZXYpDQoNCmdnYXJyYW5nZShyYWJ1LmJhYy5zZ2EscmFidS52aXIuc2dhLCBjb21tb24ubGVnZW5kID0gVFJVRSwgbGVnZW5kID0gImJvdHRvbSIpDQpgYGANCg0KIyBEaWZmZXJlbnRpYWwgYWJ1bmRhbmNlIC0gRGVzZXEyDQoNCiMjIERheXMNCg0KIyMjIEJhY3RlcmlhDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZz1GfQ0KI1NldHRpbmdzIGZvciBjdXRvZmYgdmFsdWVzIGZvciBwbG90dGluZw0KYWxwaGEgPSAwLjA1ICNtaW5pbXVtIHAtdmFsdWUNCmJldGEgPSAyICNtaW5pbXVtIGxvZy1mb2xkIGRpZmZlcmVuY2UgDQoNClBTQi5wc2V1IDwtIHN1YnNldF9zYW1wbGVzKFBTQiwgRGF5cyAlaW4lIGMoMTUsOTApKQ0KDQojUFNCLnBzZXVAc2FtX2RhdGEkRGF5cyA8LSBhcy5mYWN0b3IoUFNCLnBzZXVAc2FtX2RhdGEkRGF5cykNCg0Kb3R1X3RhYmxlKFBTQi5wc2V1KSA9IG90dV90YWJsZShQU0IucHNldSkrMQ0KDQpkaWFnZGRzID0gcGh5bG9zZXFfdG9fZGVzZXEyKFBTQi5wc2V1LCB+IERheXMpDQpkaWFnZGRzID0gREVTZXEyOjpERVNlcShkaWFnZGRzLCB0ZXN0PSJXYWxkIiwgZml0VHlwZT0icGFyYW1ldHJpYyIpDQoNCnJlcyA9IHJlc3VsdHMoZGlhZ2RkcywgY29va3NDdXRvZmYgPSBGQUxTRSkNCg0Kc2lndGFiID0gcmVzW3doaWNoKHJlcyRwYWRqIDwgYWxwaGEgJiBhYnMocmVzJGxvZzJGb2xkQ2hhbmdlKSA+IGJldGEpLF0gI1NlbGVjdCB2YWx1ZXMgZnJvbSByZXN1bHRzIGZpbGUgd2l0aCBhZGogcCB2YWx1ZXM+YWxwaGEgQU5EIGxvZzJmb2xkIGNhaG5nZT5iZXRhDQpzaWd0YWIgPSBjYmluZChhcyhzaWd0YWIsICJkYXRhLmZyYW1lIiksIGFzLm1hdHJpeChwaHlsb3NlcTo6dGF4X3RhYmxlKFBTQilbcm93bmFtZXMoc2lndGFiKSwgXSkpDQojaGVhZChzaWd0YWIpDQoNCiNQbG90dGluZyAtIGdlbnVzDQojIE9yZGVyIG9yZGVyIGJhc2VkIG9uIGFidW5kYW5jZSANCnggPSB0YXBwbHkoc2lndGFiJGxvZzJGb2xkQ2hhbmdlLCBzaWd0YWIkT3JkZXIsIGZ1bmN0aW9uKHgpIG1heCh4KSkNCnggPSBzb3J0KHgsIFRSVUUpDQpzaWd0YWIkT3JkZXIgPSBmYWN0b3IoYXMuY2hhcmFjdGVyKHNpZ3RhYiRPcmRlciksIGxldmVscz1uYW1lcyh4KSkNCiMgR2VudXMgb3JkZXIgYmFzZWQgb24gYWJ1bmRhbmNlIA0KeCA9IHRhcHBseShzaWd0YWIkbG9nMkZvbGRDaGFuZ2UsIHNpZ3RhYiRHZW51cywgZnVuY3Rpb24oeCkgbWF4KHgpKQ0KeCA9IHNvcnQoeCwgVFJVRSkNCnNpZ3RhYiRHZW51cyA9IGZhY3Rvcihhcy5jaGFyYWN0ZXIoc2lndGFiJEdlbnVzKSwgbGV2ZWxzPW5hbWVzKHgpKQ0KDQpkaWZmcGxvdCA8LSBnZ3Bsb3Qoc2lndGFiLCBhZXMoeD1HZW51cywgeT1sb2cyRm9sZENoYW5nZSwgY29sb3I9T3JkZXIpKSArIGdlb21fcG9pbnQoc2l6ZT02KSArIA0KICBzY2FsZV9jb2xvdXJfamNvKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IC05MCwgaGp1c3QgPSAwLCB2anVzdD0wLjUpKSsNCiAgZ2d0aXRsZSgiRGlmZmVyZW50aWFsIGFidW5kYW5jZSBieSBHZXN0YXRpb25hbCBhZ2UiKQ0KDQoNCiMjSGVhdG1hcCBvZiBkaWZmZXJlbnRpYWxseSBhYnVuZGFudCBzcGVjaWVzDQoNCiNQU0IuZGlmZiA8LSBtZXJnZV9waHlsb3NlcShzdWJzZXQob3R1X3RhYmxlKFBTQiksIHJvd25hbWVzKG90dV90YWJsZShQU0IpKSAlaW4lIHJvd25hbWVzKHNpZ3RhYikpLHBoeWxvc2VxOjp0YXhfdGFibGUoUFNCKSwgc2FtcGxlX2RhdGEoUFNCKSkNCg0KUFNCLnJlbCA8LSBtaWNyb2Jpb21lOjp0cmFuc2Zvcm0oUFNCLCAiY29tcG9zaXRpb25hbCIpDQoNClBTQi5kaWZmLnJlbCA8LSBtZXJnZV9waHlsb3NlcShzdWJzZXQob3R1X3RhYmxlKFBTQi5yZWwpLCByb3duYW1lcyhvdHVfdGFibGUoUFNCLnJlbCkpICVpbiUgcm93bmFtZXMoc2lndGFiKSkscGh5bG9zZXE6OnRheF90YWJsZShQU0IucmVsKSwgc2FtcGxlX2RhdGEoUFNCLnJlbCkpDQoNCmFtcHZpczJfUFNCLmRpZmYucmVsIDwtIGFtcF9sb2FkKFBTQi5kaWZmLnJlbCkgI0NvbnZlcnQgcGh5bG9zZXEgdG8gYW1wdmlzMiBvYmplY3QNCg0KYW1wdmlzMl9QU0IuZGlmZi5yZWwkYWJ1bmQgPC0gYW1wdmlzMl9QU0IuZGlmZi5yZWwkYWJ1bmQqMTAwICNNdWx0aXBseSByZWxhdGl2ZSBhYnVuZGFuY2UgYnkgMTAwIGZvciByZWFkIHBlcmNlbnRhZ2UNCg0KYW1wX2hlYXRtYXAoYW1wdmlzMl9QU0IuZGlmZi5yZWwsDQogICAgICAgICAgICBncm91cF9ieSA9ICJEYXlzIiwNCiAgICAgICAgICAgIHRheF9hZ2dyZWdhdGUgPSAiU3BlY2llcyIsDQogICAgICAgICAgICB0YXhfc2hvdyA9IDEyLA0KICAgICAgICAgICAgbm9ybWFsaXNlID0gRkFMU0UsDQogICAgICAgICAgICB0YXhfZW1wdHkgPSAiYmVzdCIsDQogICAgICAgICAgICB0YXhfYWRkID0gIkZhbWlseSIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZ2d0aXRsZSgiRGlmZmVyZW50aWFsbHkgYWJ1bmRhbnQgYmFjdGVyaWFsIGdlbmVyYSBkYXlzIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldikNCg0KYGBgDQoNCiMjIyBWaXJvbWUNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nPUZ9DQojU2V0dGluZ3MgZm9yIGN1dG9mZiB2YWx1ZXMgZm9yIHBsb3R0aW5nDQphbHBoYSA9IDAuMDUgI21pbmltdW0gcC12YWx1ZQ0KYmV0YSA9IDIgI21pbmltdW0gbG9nLWZvbGQgZGlmZmVyZW5jZSANCg0KUFNWLnBzZXUgPC0gc3Vic2V0X3NhbXBsZXMoUFNWLCBEYXlzICVpbiUgYygxNSw5MCkpDQojUFNWLnBzZXUgPC0gUFNWDQoNCiNQU1YucHNldUBzYW1fZGF0YSREYXlzIDwtIGFzLmZhY3RvcihQU1YucHNldUBzYW1fZGF0YSREYXlzKQ0KDQpvdHVfdGFibGUoUFNWLnBzZXUpID0gb3R1X3RhYmxlKFBTVi5wc2V1KSsxICNBZGQgc3B1ZG9jb3VudCBvZiBvbmUgdG8gYXZvaWQgREVTZXEyIGVycm9yKGxvZyB0cmFuc2Zvcm1hdGlvbiBmaWxsIGJlIHBlcmZvcm1lZCBhbnl3YXlzKQ0KDQpkaWFnZGRzID0gcGh5bG9zZXFfdG9fZGVzZXEyKFBTVi5wc2V1LCB+IERheXMpDQpkaWFnZGRzID0gREVTZXEyOjpERVNlcShkaWFnZGRzLCB0ZXN0PSJXYWxkIiwgZml0VHlwZT0icGFyYW1ldHJpYyIpDQoNCnJlcyA9IHJlc3VsdHMoZGlhZ2RkcywgY29va3NDdXRvZmYgPSBGQUxTRSkNCg0Kc2lndGFiID0gcmVzW3doaWNoKHJlcyRwYWRqIDwgYWxwaGEgJiBhYnMocmVzJGxvZzJGb2xkQ2hhbmdlKSA+IGJldGEpLF0gI1NlbGVjdCB2YWx1ZXMgZnJvbSByZXN1bHRzIGZpbGUgd2l0aCBhZGogcCB2YWx1ZXM+YWxwaGEgQU5EIGxvZzJmb2xkIGNhaG5nZT5iZXRhDQpzaWd0YWIgPSBjYmluZChhcyhzaWd0YWIsICJkYXRhLmZyYW1lIiksIGFzLm1hdHJpeChwaHlsb3NlcTo6dGF4X3RhYmxlKFBTVilbcm93bmFtZXMoc2lndGFiKSwgXSkpDQojaGVhZChzaWd0YWIpDQoNCiNQbG90dGluZyAtIGdlbnVzDQojIE9yZGVyIG9yZGVyIGJhc2VkIG9uIGFidW5kYW5jZSANCnggPSB0YXBwbHkoc2lndGFiJGxvZzJGb2xkQ2hhbmdlLCBzaWd0YWIkT3JkZXIsIGZ1bmN0aW9uKHgpIG1heCh4KSkNCnggPSBzb3J0KHgsIFRSVUUpDQpzaWd0YWIkT3JkZXIgPSBmYWN0b3IoYXMuY2hhcmFjdGVyKHNpZ3RhYiRPcmRlciksIGxldmVscz1uYW1lcyh4KSkNCiMgR2VudXMgb3JkZXIgYmFzZWQgb24gYWJ1bmRhbmNlIA0KeCA9IHRhcHBseShzaWd0YWIkbG9nMkZvbGRDaGFuZ2UsIHNpZ3RhYiRHZW51cywgZnVuY3Rpb24oeCkgbWF4KHgpKQ0KeCA9IHNvcnQoeCwgVFJVRSkNCnNpZ3RhYiRHZW51cyA9IGZhY3Rvcihhcy5jaGFyYWN0ZXIoc2lndGFiJEdlbnVzKSwgbGV2ZWxzPW5hbWVzKHgpKQ0KDQpkaWZmcGxvdCA8LSBnZ3Bsb3Qoc2lndGFiLCBhZXMoeD1HZW51cywgeT1sb2cyRm9sZENoYW5nZSwgY29sb3I9T3JkZXIpKSArIGdlb21fcG9pbnQoc2l6ZT02KSArIA0KICBzY2FsZV9jb2xvdXJfamNvKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IC05MCwgaGp1c3QgPSAwLCB2anVzdD0wLjUpKSsNCiAgZ2d0aXRsZSgiRGlmZmVyZW50aWFsIGFidW5kYW5jZSBieSBHZXN0YXRpb25hbCBhZ2UiKQ0KDQoNCiMjSGVhdG1hcCBvZiBkaWZmZXJlbnRpYWxseSBhYnVuZGFudCBzcGVjaWVzDQoNCiNQU1YuZGlmZiA8LSBtZXJnZV9waHlsb3NlcShzdWJzZXQob3R1X3RhYmxlKFBTViksIHJvd25hbWVzKG90dV90YWJsZShQU1YpKSAlaW4lIHJvd25hbWVzKHNpZ3RhYikpLHBoeWxvc2VxOjp0YXhfdGFibGUoUFNWKSwgc2FtcGxlX2RhdGEoUFNWKSkNCg0KUFNWLnJlbCA8LSBtaWNyb2Jpb21lOjp0cmFuc2Zvcm0oUFNWLCAiY29tcG9zaXRpb25hbCIpDQoNClBTVi5kaWZmLnJlbCA8LSBtZXJnZV9waHlsb3NlcShzdWJzZXQob3R1X3RhYmxlKFBTVi5yZWwpLCByb3duYW1lcyhvdHVfdGFibGUoUFNWLnJlbCkpICVpbiUgcm93bmFtZXMoc2lndGFiKSkscGh5bG9zZXE6OnRheF90YWJsZShQU1YucmVsKSwgc2FtcGxlX2RhdGEoUFNWLnJlbCkpDQoNCg0KI2dsb20gPC0gdGF4X2dsb20oc3Vic2V0X3RheGEoUFNWLmRpZmYsIEtpbmdkb20gIT0gIiIpLCAiU3BlY2llcyIsIE5Bcm0gPSBGQUxTRSkNCg0KI1JlbW92ZSBSZWFsbSBmcm9tIHBoeWxvc2VxOjp0YXhfdGFibGUNClBTVi5kaWZmLnJlbEB0YXhfdGFibGUgPC0gcGh5bG9zZXE6OnRheF90YWJsZShQU1YuZGlmZi5yZWwpWyxjKDEsMzo4KV0NCg0KYW1wdmlzMl9QU1YuZGlmZi5yZWwgPC0gYW1wdmlzMjo6YW1wX2xvYWQoUFNWLmRpZmYucmVsKSAjQ29udmVydCBwaHlsb3NlcSB0byBhbXB2aXMyIG9iamVjdA0KDQphbXB2aXMyX1BTVi5kaWZmLnJlbCRhYnVuZCA8LSBhbXB2aXMyX1BTVi5kaWZmLnJlbCRhYnVuZCoxMDAgI011bHRpcGx5IHJlbGF0aXZlIGFidW5kYW5jZSBieSAxMDAgZm9yIHJlYWQgcGVyY2VudGFnZQ0KDQphbXBfaGVhdG1hcChhbXB2aXMyX1BTVi5kaWZmLnJlbCwNCiAgICAgICAgICAgIGdyb3VwX2J5ID0gIkRheXMiLA0KICAgICAgICAgICAgdGF4X2FnZ3JlZ2F0ZSA9ICJTcGVjaWVzIiwNCiAgICAgICAgICAgIHRheF9zaG93ID0gMTUsDQogICAgICAgICAgICBub3JtYWxpc2UgPSBGQUxTRSwNCiAgICAgICAgICAgIHRheF9lbXB0eSA9ICJiZXN0IiwNCiAgICAgICAgICAgIHRheF9hZGQgPSAiRmFtaWx5IikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBnZ3RpdGxlKCJEaWZmZXJlbnRpYWxseSBhYnVuZGFudCB2aXJhbCBzcGVjaWVzIikNCg0KYGBgDQoNCiMjIyBWaXJvbWUgaG9zdHMNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nPUZ9DQoNClBTVi5yZWwgPC0gbWljcm9iaW9tZTo6dHJhbnNmb3JtKFBTVi5ob3N0LCAiY29tcG9zaXRpb25hbCIpDQoNClBTVi5kaWZmLnJlbCA8LSBtZXJnZV9waHlsb3NlcShzdWJzZXQob3R1X3RhYmxlKFBTVi5yZWwpLCByb3duYW1lcyhvdHVfdGFibGUoUFNWLnJlbCkpICVpbiUgcm93bmFtZXMoc2lndGFiKSkscGh5bG9zZXE6OnRheF90YWJsZShQU1YucmVsKSwgc2FtcGxlX2RhdGEoUFNWLnJlbCkpDQoNCg0KI2dsb20gPC0gdGF4X2dsb20oc3Vic2V0X3RheGEoUFNWLmRpZmYsIEtpbmdkb20gIT0gIiIpLCAiU3BlY2llcyIsIE5Bcm0gPSBGQUxTRSkNCg0KI1JlbW92ZSBSZWFsbSBmcm9tIHBoeWxvc2VxOjp0YXhfdGFibGUNCiNQU1YuZGlmZi5yZWxAdGF4X3RhYmxlIDwtIHBoeWxvc2VxOjp0YXhfdGFibGUoUFNWLmRpZmYucmVsKVssYygxLDM6OCldDQoNCmFtcHZpczJfUFNWLmRpZmYucmVsIDwtIGFtcHZpczI6OmFtcF9sb2FkKFBTVi5kaWZmLnJlbCkgI0NvbnZlcnQgcGh5bG9zZXEgdG8gYW1wdmlzMiBvYmplY3QNCg0KYW1wdmlzMl9QU1YuZGlmZi5yZWwkYWJ1bmQgPC0gYW1wdmlzMl9QU1YuZGlmZi5yZWwkYWJ1bmQqMTAwICNNdWx0aXBseSByZWxhdGl2ZSBhYnVuZGFuY2UgYnkgMTAwIGZvciByZWFkIHBlcmNlbnRhZ2UNCg0KYW1wX2hlYXRtYXAoYW1wdmlzMl9QU1YuZGlmZi5yZWwsDQogICAgICAgICAgICBncm91cF9ieSA9ICJEYXlzIiwNCiAgICAgICAgICAgIHRheF9hZ2dyZWdhdGUgPSAiR2VudXMiLA0KICAgICAgICAgICAgdGF4X3Nob3cgPSAxMSwNCiAgICAgICAgICAgIG5vcm1hbGlzZSA9IEZBTFNFLA0KICAgICAgICAgICAgdGF4X2VtcHR5ID0gImJlc3QiLA0KICAgICAgICAgICAgdGF4X2FkZCA9ICJGYW1pbHkiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGdndGl0bGUoIkRpZmZlcmVudGlhbGx5IGFidW5kYW50IHZpcnVzZXMgYnkgcHJlZGljdGVkIGhvc3QgZ2VuZXJhIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldikNCg0KYGBgDQoNCiMjIEJQRA0KDQojIyMgQmFjdGVyaWENCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nPUZ9DQojU2V0dGluZ3MgZm9yIGN1dG9mZiB2YWx1ZXMgZm9yIHBsb3R0aW5nDQphbHBoYSA9IDAuMDUgI21pbmltdW0gcC12YWx1ZQ0KYmV0YSA9IDIgI21pbmltdW0gbG9nLWZvbGQgZGlmZmVyZW5jZSANCg0KUFNCLnBzZXUgPC0gUFNCDQoNCiNQU0IucHNldUBzYW1fZGF0YSRCUEQgPC0gYXMuZmFjdG9yKFBTQi5wc2V1QHNhbV9kYXRhJEJQRCkNCg0Kb3R1X3RhYmxlKFBTQi5wc2V1KSA9IG90dV90YWJsZShQU0IucHNldSkgKyAxICNBZGQgc3B1ZG9jb3VudCBvZiBvbmUgdG8gYXZvaWQgREVTZXEyIGVycm9yKGxvZyB0cmFuc2Zvcm1hdGlvbiBmaWxsIGJlIHBlcmZvcm1lZCBhbnl3YXlzKQ0KDQpkaWFnZGRzID0gcGh5bG9zZXFfdG9fZGVzZXEyKFBTQi5wc2V1LCB+IEJyb25jaG9wdWxtb25hcnlfZHlzcGxhc2lhK0RheXMpDQpkaWFnZGRzID0gREVTZXEyOjpERVNlcShkaWFnZGRzLCB0ZXN0PSJXYWxkIiwgZml0VHlwZT0icGFyYW1ldHJpYyIpDQoNCnJlcyA9IHJlc3VsdHMoZGlhZ2RkcywgY29va3NDdXRvZmYgPSBGQUxTRSkNCg0Kc2lndGFiID0gcmVzW3doaWNoKHJlcyRwYWRqIDwgYWxwaGEgJiBhYnMocmVzJGxvZzJGb2xkQ2hhbmdlKSA+IGJldGEpLF0gI1NlbGVjdCB2YWx1ZXMgZnJvbSByZXN1bHRzIGZpbGUgd2l0aCBhZGogcCB2YWx1ZXM+YWxwaGEgQU5EIGxvZzJmb2xkIGNhaG5nZT5iZXRhDQpzaWd0YWIgPSBjYmluZChhcyhzaWd0YWIsICJkYXRhLmZyYW1lIiksIGFzLm1hdHJpeChwaHlsb3NlcTo6dGF4X3RhYmxlKFBTQilbcm93bmFtZXMoc2lndGFiKSwgXSkpDQojaGVhZChzaWd0YWIpDQoNCiNQbG90dGluZyAtIGdlbnVzDQojIE9yZGVyIG9yZGVyIGJhc2VkIG9uIGFidW5kYW5jZSANCnggPSB0YXBwbHkoc2lndGFiJGxvZzJGb2xkQ2hhbmdlLCBzaWd0YWIkT3JkZXIsIGZ1bmN0aW9uKHgpIG1heCh4KSkNCnggPSBzb3J0KHgsIFRSVUUpDQpzaWd0YWIkT3JkZXIgPSBmYWN0b3IoYXMuY2hhcmFjdGVyKHNpZ3RhYiRPcmRlciksIGxldmVscz1uYW1lcyh4KSkNCiMgR2VudXMgb3JkZXIgYmFzZWQgb24gYWJ1bmRhbmNlIA0KeCA9IHRhcHBseShzaWd0YWIkbG9nMkZvbGRDaGFuZ2UsIHNpZ3RhYiRHZW51cywgZnVuY3Rpb24oeCkgbWF4KHgpKQ0KeCA9IHNvcnQoeCwgVFJVRSkNCnNpZ3RhYiRHZW51cyA9IGZhY3Rvcihhcy5jaGFyYWN0ZXIoc2lndGFiJEdlbnVzKSwgbGV2ZWxzPW5hbWVzKHgpKQ0KDQpkaWZmcGxvdCA8LSBnZ3Bsb3Qoc2lndGFiLCBhZXMoeD1HZW51cywgeT1sb2cyRm9sZENoYW5nZSwgY29sb3I9T3JkZXIpKSArIGdlb21fcG9pbnQoc2l6ZT02KSArIA0KICBzY2FsZV9jb2xvdXJfamNvKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IC05MCwgaGp1c3QgPSAwLCB2anVzdD0wLjUpKSsNCiAgZ2d0aXRsZSgiRGlmZmVyZW50aWFsIGFidW5kYW5jZSBieSBHZXN0YXRpb25hbCBhZ2UiKQ0KDQoNCiMjSGVhdG1hcCBvZiBkaWZmZXJlbnRpYWxseSBhYnVuZGFudCBzcGVjaWVzDQoNCiNQU0IuZGlmZiA8LSBtZXJnZV9waHlsb3NlcShzdWJzZXQob3R1X3RhYmxlKFBTQiksIHJvd25hbWVzKG90dV90YWJsZShQU0IpKSAlaW4lIHJvd25hbWVzKHNpZ3RhYikpLHBoeWxvc2VxOjp0YXhfdGFibGUoUFNCKSwgc2FtcGxlX2RhdGEoUFNCKSkNCg0KUFNCLnJlbCA8LSBtaWNyb2Jpb21lOjp0cmFuc2Zvcm0oUFNCLCAiY29tcG9zaXRpb25hbCIpDQoNClBTQi5kaWZmLnJlbCA8LSBtZXJnZV9waHlsb3NlcShzdWJzZXQob3R1X3RhYmxlKFBTQi5yZWwpLCByb3duYW1lcyhvdHVfdGFibGUoUFNCLnJlbCkpICVpbiUgcm93bmFtZXMoc2lndGFiKSkscGh5bG9zZXE6OnRheF90YWJsZShQU0IucmVsKSwgc2FtcGxlX2RhdGEoUFNCLnJlbCkpDQoNCg0KI2dsb20gPC0gdGF4X2dsb20oc3Vic2V0X3RheGEoUFNCLmRpZmYsIEtpbmdkb20gIT0gIiIpLCAiU3BlY2llcyIsIE5Bcm0gPSBGQUxTRSkNCg0KDQphbXB2aXMyX1BTQi5kaWZmLnJlbCA8LSBhbXB2aXMyOjphbXBfbG9hZChQU0IuZGlmZi5yZWwpICNDb252ZXJ0IHBoeWxvc2VxIHRvIGFtcHZpczIgb2JqZWN0DQoNCmFtcHZpczJfUFNCLmRpZmYucmVsJGFidW5kIDwtIGFtcHZpczJfUFNCLmRpZmYucmVsJGFidW5kKjEwMCAjTXVsdGlwbHkgcmVsYXRpdmUgYWJ1bmRhbmNlIGJ5IDEwMCBmb3IgcmVhZCBwZXJjZW50YWdlDQoNCmRlc2VxMl9hbXBfYnBkX2JhYyA8LSBhbXBfaGVhdG1hcChhbXB2aXMyX1BTQi5kaWZmLnJlbCwNCiAgICAgICAgICAgIGdyb3VwX2J5ID0gIkJyb25jaG9wdWxtb25hcnlfZHlzcGxhc2lhIiwNCiAgICAgICAgICAgIHRheF9hZ2dyZWdhdGUgPSAiR2VudXMiLA0KICAgICAgICAgICAgdGF4X3Nob3cgPSAxMiwNCiAgICAgICAgICAgIG5vcm1hbGlzZSA9IEZBTFNFLA0KICAgICAgICAgICAgdGF4X2VtcHR5ID0gImJlc3QiLA0KICAgICAgICAgICAgdGF4X2FkZCA9ICJGYW1pbHkiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGdndGl0bGUoIkJhY3RlcmlhIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldikNCg0KZGVzZXEyX2FtcF9icGRfYmFjDQpgYGANCg0KIyMjIFZpcm9tZQ0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmc9Rn0NCiNTZXR0aW5ncyBmb3IgY3V0b2ZmIHZhbHVlcyBmb3IgcGxvdHRpbmcNCmFscGhhID0gMC4wNSAjbWluaW11bSBwLXZhbHVlDQpiZXRhID0gMiAjbWluaW11bSBsb2ctZm9sZCBkaWZmZXJlbmNlIA0KDQpQU1YucHNldSA8LSBQU1YNCg0KI1BTVi5wc2V1QHNhbV9kYXRhJEJQRCA8LSBhcy5mYWN0b3IoUFNWLnBzZXVAc2FtX2RhdGEkQlBEKQ0KDQpvdHVfdGFibGUoUFNWLnBzZXUpID0gb3R1X3RhYmxlKFBTVi5wc2V1KSsxICNBZGQgc3B1ZG9jb3VudCBvZiBvbmUgdG8gYXZvaWQgREVTZXEyIGVycm9yKGxvZyB0cmFuc2Zvcm1hdGlvbiBmaWxsIGJlIHBlcmZvcm1lZCBhbnl3YXlzKQ0KDQpkaWFnZGRzID0gcGh5bG9zZXFfdG9fZGVzZXEyKFBTVi5wc2V1LCB+IEJyb25jaG9wdWxtb25hcnlfZHlzcGxhc2lhK0RheXMpDQpkaWFnZGRzID0gREVTZXEyOjpERVNlcShkaWFnZGRzLCB0ZXN0PSJXYWxkIiwgZml0VHlwZT0icGFyYW1ldHJpYyIpDQoNCnJlcyA9IHJlc3VsdHMoZGlhZ2RkcywgY29va3NDdXRvZmYgPSBGQUxTRSkNCg0Kc2lndGFiID0gcmVzW3doaWNoKHJlcyRwYWRqIDwgYWxwaGEgJiBhYnMocmVzJGxvZzJGb2xkQ2hhbmdlKSA+IGJldGEpLF0gI1NlbGVjdCB2YWx1ZXMgZnJvbSByZXN1bHRzIGZpbGUgd2l0aCBhZGogcCB2YWx1ZXM+YWxwaGEgQU5EIGxvZzJmb2xkIGNhaG5nZT5iZXRhDQpzaWd0YWIgPSBjYmluZChhcyhzaWd0YWIsICJkYXRhLmZyYW1lIiksIGFzLm1hdHJpeChwaHlsb3NlcTo6dGF4X3RhYmxlKFBTVilbcm93bmFtZXMoc2lndGFiKSwgXSkpDQojaGVhZChzaWd0YWIpDQoNCiNQbG90dGluZyAtIGdlbnVzDQojIE9yZGVyIG9yZGVyIGJhc2VkIG9uIGFidW5kYW5jZSANCnggPSB0YXBwbHkoc2lndGFiJGxvZzJGb2xkQ2hhbmdlLCBzaWd0YWIkT3JkZXIsIGZ1bmN0aW9uKHgpIG1heCh4KSkNCnggPSBzb3J0KHgsIFRSVUUpDQpzaWd0YWIkT3JkZXIgPSBmYWN0b3IoYXMuY2hhcmFjdGVyKHNpZ3RhYiRPcmRlciksIGxldmVscz1uYW1lcyh4KSkNCiMgR2VudXMgb3JkZXIgYmFzZWQgb24gYWJ1bmRhbmNlIA0KeCA9IHRhcHBseShzaWd0YWIkbG9nMkZvbGRDaGFuZ2UsIHNpZ3RhYiRHZW51cywgZnVuY3Rpb24oeCkgbWF4KHgpKQ0KeCA9IHNvcnQoeCwgVFJVRSkNCnNpZ3RhYiRHZW51cyA9IGZhY3Rvcihhcy5jaGFyYWN0ZXIoc2lndGFiJEdlbnVzKSwgbGV2ZWxzPW5hbWVzKHgpKQ0KDQpkaWZmcGxvdCA8LSBnZ3Bsb3Qoc2lndGFiLCBhZXMoeD1HZW51cywgeT1sb2cyRm9sZENoYW5nZSwgY29sb3I9T3JkZXIpKSArIGdlb21fcG9pbnQoc2l6ZT02KSArIA0KICBzY2FsZV9jb2xvdXJfamNvKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IC05MCwgaGp1c3QgPSAwLCB2anVzdD0wLjUpKSsNCiAgZ2d0aXRsZSgiRGlmZmVyZW50aWFsIGFidW5kYW5jZSBieSBHZXN0YXRpb25hbCBhZ2UiKQ0KDQoNCiMjSGVhdG1hcCBvZiBkaWZmZXJlbnRpYWxseSBhYnVuZGFudCBzcGVjaWVzDQoNCiNQU1YuZGlmZiA8LSBtZXJnZV9waHlsb3NlcShzdWJzZXQob3R1X3RhYmxlKFBTViksIHJvd25hbWVzKG90dV90YWJsZShQU1YpKSAlaW4lIHJvd25hbWVzKHNpZ3RhYikpLHBoeWxvc2VxOjp0YXhfdGFibGUoUFNWKSwgc2FtcGxlX2RhdGEoUFNWKSkNCg0KUFNWLnJlbCA8LSBtaWNyb2Jpb21lOjp0cmFuc2Zvcm0oUFNWLCAiY29tcG9zaXRpb25hbCIpDQoNClBTVi5kaWZmLnJlbCA8LSBtZXJnZV9waHlsb3NlcShzdWJzZXQob3R1X3RhYmxlKFBTVi5yZWwpLCByb3duYW1lcyhvdHVfdGFibGUoUFNWLnJlbCkpICVpbiUgcm93bmFtZXMoc2lndGFiKSkscGh5bG9zZXE6OnRheF90YWJsZShQU1YucmVsKSwgc2FtcGxlX2RhdGEoUFNWLnJlbCkpDQoNCg0KI2dsb20gPC0gdGF4X2dsb20oc3Vic2V0X3RheGEoUFNWLmRpZmYsIEtpbmdkb20gIT0gIiIpLCAiU3BlY2llcyIsIE5Bcm0gPSBGQUxTRSkNCg0KI1JlbW92ZSBSZWFsbSBmcm9tIHBoeWxvc2VxOjp0YXhfdGFibGUNClBTVi5kaWZmLnJlbEB0YXhfdGFibGUgPC0gcGh5bG9zZXE6OnRheF90YWJsZShQU1YuZGlmZi5yZWwpWyxjKDEsMzo4KV0NCg0KYW1wdmlzMl9QU1YuZGlmZi5yZWwgPC0gYW1wdmlzMjo6YW1wX2xvYWQoUFNWLmRpZmYucmVsKSAjQ29udmVydCBwaHlsb3NlcSB0byBhbXB2aXMyIG9iamVjdA0KDQphbXB2aXMyX1BTVi5kaWZmLnJlbCRhYnVuZCA8LSBhbXB2aXMyX1BTVi5kaWZmLnJlbCRhYnVuZCoxMDAgI011bHRpcGx5IHJlbGF0aXZlIGFidW5kYW5jZSBieSAxMDAgZm9yIHJlYWQgcGVyY2VudGFnZQ0KDQphbXBfaGVhdG1hcChhbXB2aXMyX1BTVi5kaWZmLnJlbCwNCiAgICAgICAgICAgIGdyb3VwX2J5ID0gIkJyb25jaG9wdWxtb25hcnlfZHlzcGxhc2lhIiwNCiAgICAgICAgICAgIHRheF9hZ2dyZWdhdGUgPSAiU3BlY2llcyIsDQogICAgICAgICAgICB0YXhfc2hvdyA9IDEyLA0KICAgICAgICAgICAgbm9ybWFsaXNlID0gRkFMU0UsDQogICAgICAgICAgICB0YXhfZW1wdHkgPSAiYmVzdCIsDQogICAgICAgICAgICB0YXhfYWRkID0gIkZhbWlseSIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZ2d0aXRsZSgiRGlmZmVyZW50aWFsbHkgYWJ1bmRhbnQgdmlyYWwgc3BlY2llcyIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSByZXYpDQoNCmBgYA0KDQojIyMgVmlyYWwgaG9zdHMNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nPUZ9DQoNClBTVi5yZWwgPC0gbWljcm9iaW9tZTo6dHJhbnNmb3JtKFBTVi5ob3N0LCAiY29tcG9zaXRpb25hbCIpDQoNClBTVi5kaWZmLnJlbCA8LSBtZXJnZV9waHlsb3NlcShzdWJzZXQob3R1X3RhYmxlKFBTVi5yZWwpLCByb3duYW1lcyhvdHVfdGFibGUoUFNWLnJlbCkpICVpbiUgcm93bmFtZXMoc2lndGFiKSkscGh5bG9zZXE6OnRheF90YWJsZShQU1YucmVsKSwgc2FtcGxlX2RhdGEoUFNWLnJlbCkpDQoNCg0KI2dsb20gPC0gdGF4X2dsb20oc3Vic2V0X3RheGEoUFNWLmRpZmYsIEtpbmdkb20gIT0gIiIpLCAiU3BlY2llcyIsIE5Bcm0gPSBGQUxTRSkNCg0KI1JlbW92ZSBSZWFsbSBmcm9tIHBoeWxvc2VxOjp0YXhfdGFibGUNCiNQU1YuZGlmZi5yZWxAdGF4X3RhYmxlIDwtIHBoeWxvc2VxOjp0YXhfdGFibGUoUFNWLmRpZmYucmVsKVssYygxLDM6OCldDQoNCmFtcHZpczJfUFNWLmRpZmYucmVsIDwtIGFtcHZpczI6OmFtcF9sb2FkKFBTVi5kaWZmLnJlbCkgI0NvbnZlcnQgcGh5bG9zZXEgdG8gYW1wdmlzMiBvYmplY3QNCg0KYW1wdmlzMl9QU1YuZGlmZi5yZWwkYWJ1bmQgPC0gYW1wdmlzMl9QU1YuZGlmZi5yZWwkYWJ1bmQqMTAwICNNdWx0aXBseSByZWxhdGl2ZSBhYnVuZGFuY2UgYnkgMTAwIGZvciByZWFkIHBlcmNlbnRhZ2UNCg0KZGVzZXEyX2FtcF9icGRfdmlyX2hvc3QgPC0gYW1wX2hlYXRtYXAoYW1wdmlzMl9QU1YuZGlmZi5yZWwsDQogICAgICAgICAgICBncm91cF9ieSA9ICJCcm9uY2hvcHVsbW9uYXJ5X2R5c3BsYXNpYSIsDQogICAgICAgICAgICB0YXhfYWdncmVnYXRlID0gIkdlbnVzIiwNCiAgICAgICAgICAgIHRheF9zaG93ID0gMTEsDQogICAgICAgICAgICBub3JtYWxpc2UgPSBGQUxTRSwNCiAgICAgICAgICAgIHRheF9lbXB0eSA9ICJiZXN0IiwNCiAgICAgICAgICAgIHRheF9hZGQgPSAiRmFtaWx5IikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBnZ3RpdGxlKCJWaXJhbCBob3N0IikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldikNCg0KZGVzZXEyX2FtcF9icGRfdmlyX2hvc3QNCmBgYA0KDQojIyBTbWFsbCBmb3IgZ2VzdGF0aW9uYWwgYWdlDQoNCiMjIyBCYWN0ZXJpYQ0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmc9Rn0NCiNTZXR0aW5ncyBmb3IgY3V0b2ZmIHZhbHVlcyBmb3IgcGxvdHRpbmcNCmFscGhhID0gMC4wNSAjbWluaW11bSBwLXZhbHVlDQpiZXRhID0gMiAjbWluaW11bSBsb2ctZm9sZCBkaWZmZXJlbmNlIA0KDQpQU0IucHNldSA8LSBQU0INCg0KI1BTQi5wc2V1QHNhbV9kYXRhJEJQRCA8LSBhcy5mYWN0b3IoUFNCLnBzZXVAc2FtX2RhdGEkQlBEKQ0KDQpvdHVfdGFibGUoUFNCLnBzZXUpID0gb3R1X3RhYmxlKFBTQi5wc2V1KSArIDEgI0FkZCBzcHVkb2NvdW50IG9mIG9uZSB0byBhdm9pZCBERVNlcTIgZXJyb3IobG9nIHRyYW5zZm9ybWF0aW9uIGZpbGwgYmUgcGVyZm9ybWVkIGFueXdheXMpDQoNCmRpYWdkZHMgPSBwaHlsb3NlcV90b19kZXNlcTIoUFNCLnBzZXUsIH4gU21hbGxfZm9yX2dlc3RhdGlvbmFsX2FnZStEYXlzKQ0KZGlhZ2RkcyA9IERFU2VxMjo6REVTZXEoZGlhZ2RkcywgdGVzdD0iV2FsZCIsIGZpdFR5cGU9InBhcmFtZXRyaWMiKQ0KDQpyZXMgPSByZXN1bHRzKGRpYWdkZHMsIGNvb2tzQ3V0b2ZmID0gRkFMU0UpDQoNCnNpZ3RhYiA9IHJlc1t3aGljaChyZXMkcGFkaiA8IGFscGhhICYgYWJzKHJlcyRsb2cyRm9sZENoYW5nZSkgPiBiZXRhKSxdICNTZWxlY3QgdmFsdWVzIGZyb20gcmVzdWx0cyBmaWxlIHdpdGggYWRqIHAgdmFsdWVzPmFscGhhIEFORCBsb2cyZm9sZCBjYWhuZ2U+YmV0YQ0Kc2lndGFiID0gY2JpbmQoYXMoc2lndGFiLCAiZGF0YS5mcmFtZSIpLCBhcy5tYXRyaXgocGh5bG9zZXE6OnRheF90YWJsZShQU0IpW3Jvd25hbWVzKHNpZ3RhYiksIF0pKQ0KI2hlYWQoc2lndGFiKQ0KDQojUGxvdHRpbmcgLSBnZW51cw0KIyBPcmRlciBvcmRlciBiYXNlZCBvbiBhYnVuZGFuY2UgDQp4ID0gdGFwcGx5KHNpZ3RhYiRsb2cyRm9sZENoYW5nZSwgc2lndGFiJE9yZGVyLCBmdW5jdGlvbih4KSBtYXgoeCkpDQp4ID0gc29ydCh4LCBUUlVFKQ0Kc2lndGFiJE9yZGVyID0gZmFjdG9yKGFzLmNoYXJhY3RlcihzaWd0YWIkT3JkZXIpLCBsZXZlbHM9bmFtZXMoeCkpDQojIEdlbnVzIG9yZGVyIGJhc2VkIG9uIGFidW5kYW5jZSANCnggPSB0YXBwbHkoc2lndGFiJGxvZzJGb2xkQ2hhbmdlLCBzaWd0YWIkR2VudXMsIGZ1bmN0aW9uKHgpIG1heCh4KSkNCnggPSBzb3J0KHgsIFRSVUUpDQpzaWd0YWIkR2VudXMgPSBmYWN0b3IoYXMuY2hhcmFjdGVyKHNpZ3RhYiRHZW51cyksIGxldmVscz1uYW1lcyh4KSkNCg0KZGlmZnBsb3QgPC0gZ2dwbG90KHNpZ3RhYiwgYWVzKHg9R2VudXMsIHk9bG9nMkZvbGRDaGFuZ2UsIGNvbG9yPU9yZGVyKSkgKyBnZW9tX3BvaW50KHNpemU9NikgKyANCiAgc2NhbGVfY29sb3VyX2pjbygpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAtOTAsIGhqdXN0ID0gMCwgdmp1c3Q9MC41KSkrDQogIGdndGl0bGUoIkRpZmZlcmVudGlhbCBhYnVuZGFuY2UgYnkgR2VzdGF0aW9uYWwgYWdlIikNCg0KDQojI0hlYXRtYXAgb2YgZGlmZmVyZW50aWFsbHkgYWJ1bmRhbnQgc3BlY2llcw0KDQojUFNCLmRpZmYgPC0gbWVyZ2VfcGh5bG9zZXEoc3Vic2V0KG90dV90YWJsZShQU0IpLCByb3duYW1lcyhvdHVfdGFibGUoUFNCKSkgJWluJSByb3duYW1lcyhzaWd0YWIpKSxwaHlsb3NlcTo6dGF4X3RhYmxlKFBTQiksIHNhbXBsZV9kYXRhKFBTQikpDQoNClBTQi5yZWwgPC0gbWljcm9iaW9tZTo6dHJhbnNmb3JtKFBTQiwgImNvbXBvc2l0aW9uYWwiKQ0KDQpQU0IuZGlmZi5yZWwgPC0gbWVyZ2VfcGh5bG9zZXEoc3Vic2V0KG90dV90YWJsZShQU0IucmVsKSwgcm93bmFtZXMob3R1X3RhYmxlKFBTQi5yZWwpKSAlaW4lIHJvd25hbWVzKHNpZ3RhYikpLHBoeWxvc2VxOjp0YXhfdGFibGUoUFNCLnJlbCksIHNhbXBsZV9kYXRhKFBTQi5yZWwpKQ0KDQoNCiNnbG9tIDwtIHRheF9nbG9tKHN1YnNldF90YXhhKFBTQi5kaWZmLCBLaW5nZG9tICE9ICIiKSwgIlNwZWNpZXMiLCBOQXJtID0gRkFMU0UpDQoNCg0KYW1wdmlzMl9QU0IuZGlmZi5yZWwgPC0gYW1wdmlzMjo6YW1wX2xvYWQoUFNCLmRpZmYucmVsKSAjQ29udmVydCBwaHlsb3NlcSB0byBhbXB2aXMyIG9iamVjdA0KDQphbXB2aXMyX1BTQi5kaWZmLnJlbCRhYnVuZCA8LSBhbXB2aXMyX1BTQi5kaWZmLnJlbCRhYnVuZCoxMDAgI011bHRpcGx5IHJlbGF0aXZlIGFidW5kYW5jZSBieSAxMDAgZm9yIHJlYWQgcGVyY2VudGFnZQ0KDQpkZXNlcTJfYW1wX3NnYV9iYWMgPC0gYW1wX2hlYXRtYXAoYW1wdmlzMl9QU0IuZGlmZi5yZWwsDQogICAgICAgICAgICBncm91cF9ieSA9ICJTbWFsbF9mb3JfZ2VzdGF0aW9uYWxfYWdlIiwNCiAgICAgICAgICAgIHRheF9hZ2dyZWdhdGUgPSAiR2VudXMiLA0KICAgICAgICAgICAgdGF4X3Nob3cgPSAxMiwNCiAgICAgICAgICAgIG5vcm1hbGlzZSA9IEZBTFNFLA0KICAgICAgICAgICAgdGF4X2VtcHR5ID0gImJlc3QiLA0KICAgICAgICAgICAgdGF4X2FkZCA9ICJGYW1pbHkiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGdndGl0bGUoIkJhY3RlcmlhIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldikNCg0KZGVzZXEyX2FtcF9zZ2FfYmFjDQpgYGANCg0KIyMjIFZpcm9tZQ0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmc9Rn0NCiNTZXR0aW5ncyBmb3IgY3V0b2ZmIHZhbHVlcyBmb3IgcGxvdHRpbmcNCmFscGhhID0gMC4wNSAjbWluaW11bSBwLXZhbHVlDQpiZXRhID0gMiAjbWluaW11bSBsb2ctZm9sZCBkaWZmZXJlbmNlIA0KDQpQU1YucHNldSA8LSBQU1YNCg0KI1BTVi5wc2V1QHNhbV9kYXRhJEJQRCA8LSBhcy5mYWN0b3IoUFNWLnBzZXVAc2FtX2RhdGEkQlBEKQ0KDQpvdHVfdGFibGUoUFNWLnBzZXUpID0gb3R1X3RhYmxlKFBTVi5wc2V1KSsxICNBZGQgc3B1ZG9jb3VudCBvZiBvbmUgdG8gYXZvaWQgREVTZXEyIGVycm9yKGxvZyB0cmFuc2Zvcm1hdGlvbiBmaWxsIGJlIHBlcmZvcm1lZCBhbnl3YXlzKQ0KDQpkaWFnZGRzID0gcGh5bG9zZXFfdG9fZGVzZXEyKFBTVi5wc2V1LCB+IFNtYWxsX2Zvcl9nZXN0YXRpb25hbF9hZ2UrRGF5cykNCmRpYWdkZHMgPSBERVNlcTI6OkRFU2VxKGRpYWdkZHMsIHRlc3Q9IldhbGQiLCBmaXRUeXBlPSJwYXJhbWV0cmljIikNCg0KcmVzID0gcmVzdWx0cyhkaWFnZGRzLCBjb29rc0N1dG9mZiA9IEZBTFNFKQ0KDQpzaWd0YWIgPSByZXNbd2hpY2gocmVzJHBhZGogPCBhbHBoYSAmIGFicyhyZXMkbG9nMkZvbGRDaGFuZ2UpID4gYmV0YSksXSAjU2VsZWN0IHZhbHVlcyBmcm9tIHJlc3VsdHMgZmlsZSB3aXRoIGFkaiBwIHZhbHVlcz5hbHBoYSBBTkQgbG9nMmZvbGQgY2FobmdlPmJldGENCnNpZ3RhYiA9IGNiaW5kKGFzKHNpZ3RhYiwgImRhdGEuZnJhbWUiKSwgYXMubWF0cml4KHBoeWxvc2VxOjp0YXhfdGFibGUoUFNWKVtyb3duYW1lcyhzaWd0YWIpLCBdKSkNCiNoZWFkKHNpZ3RhYikNCg0KI1Bsb3R0aW5nIC0gZ2VudXMNCiMgT3JkZXIgb3JkZXIgYmFzZWQgb24gYWJ1bmRhbmNlIA0KeCA9IHRhcHBseShzaWd0YWIkbG9nMkZvbGRDaGFuZ2UsIHNpZ3RhYiRPcmRlciwgZnVuY3Rpb24oeCkgbWF4KHgpKQ0KeCA9IHNvcnQoeCwgVFJVRSkNCnNpZ3RhYiRPcmRlciA9IGZhY3Rvcihhcy5jaGFyYWN0ZXIoc2lndGFiJE9yZGVyKSwgbGV2ZWxzPW5hbWVzKHgpKQ0KIyBHZW51cyBvcmRlciBiYXNlZCBvbiBhYnVuZGFuY2UgDQp4ID0gdGFwcGx5KHNpZ3RhYiRsb2cyRm9sZENoYW5nZSwgc2lndGFiJEdlbnVzLCBmdW5jdGlvbih4KSBtYXgoeCkpDQp4ID0gc29ydCh4LCBUUlVFKQ0Kc2lndGFiJEdlbnVzID0gZmFjdG9yKGFzLmNoYXJhY3RlcihzaWd0YWIkR2VudXMpLCBsZXZlbHM9bmFtZXMoeCkpDQoNCmRpZmZwbG90IDwtIGdncGxvdChzaWd0YWIsIGFlcyh4PUdlbnVzLCB5PWxvZzJGb2xkQ2hhbmdlLCBjb2xvcj1PcmRlcikpICsgZ2VvbV9wb2ludChzaXplPTYpICsgDQogIHNjYWxlX2NvbG91cl9qY28oKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gLTkwLCBoanVzdCA9IDAsIHZqdXN0PTAuNSkpKw0KICBnZ3RpdGxlKCJEaWZmZXJlbnRpYWwgYWJ1bmRhbmNlIGJ5IEdlc3RhdGlvbmFsIGFnZSIpDQoNCg0KIyNIZWF0bWFwIG9mIGRpZmZlcmVudGlhbGx5IGFidW5kYW50IHNwZWNpZXMNCg0KI1BTVi5kaWZmIDwtIG1lcmdlX3BoeWxvc2VxKHN1YnNldChvdHVfdGFibGUoUFNWKSwgcm93bmFtZXMob3R1X3RhYmxlKFBTVikpICVpbiUgcm93bmFtZXMoc2lndGFiKSkscGh5bG9zZXE6OnRheF90YWJsZShQU1YpLCBzYW1wbGVfZGF0YShQU1YpKQ0KDQpQU1YucmVsIDwtIG1pY3JvYmlvbWU6OnRyYW5zZm9ybShQU1YsICJjb21wb3NpdGlvbmFsIikNCg0KUFNWLmRpZmYucmVsIDwtIG1lcmdlX3BoeWxvc2VxKHN1YnNldChvdHVfdGFibGUoUFNWLnJlbCksIHJvd25hbWVzKG90dV90YWJsZShQU1YucmVsKSkgJWluJSByb3duYW1lcyhzaWd0YWIpKSxwaHlsb3NlcTo6dGF4X3RhYmxlKFBTVi5yZWwpLCBzYW1wbGVfZGF0YShQU1YucmVsKSkNCg0KDQojZ2xvbSA8LSB0YXhfZ2xvbShzdWJzZXRfdGF4YShQU1YuZGlmZiwgS2luZ2RvbSAhPSAiIiksICJTcGVjaWVzIiwgTkFybSA9IEZBTFNFKQ0KDQojUmVtb3ZlIFJlYWxtIGZyb20gcGh5bG9zZXE6OnRheF90YWJsZQ0KUFNWLmRpZmYucmVsQHRheF90YWJsZSA8LSBwaHlsb3NlcTo6dGF4X3RhYmxlKFBTVi5kaWZmLnJlbClbLGMoMSwzOjgpXQ0KDQphbXB2aXMyX1BTVi5kaWZmLnJlbCA8LSBhbXB2aXMyOjphbXBfbG9hZChQU1YuZGlmZi5yZWwpICNDb252ZXJ0IHBoeWxvc2VxIHRvIGFtcHZpczIgb2JqZWN0DQoNCmFtcHZpczJfUFNWLmRpZmYucmVsJGFidW5kIDwtIGFtcHZpczJfUFNWLmRpZmYucmVsJGFidW5kKjEwMCAjTXVsdGlwbHkgcmVsYXRpdmUgYWJ1bmRhbmNlIGJ5IDEwMCBmb3IgcmVhZCBwZXJjZW50YWdlDQoNCmFtcF9oZWF0bWFwKGFtcHZpczJfUFNWLmRpZmYucmVsLA0KICAgICAgICAgICAgZ3JvdXBfYnkgPSAiU21hbGxfZm9yX2dlc3RhdGlvbmFsX2FnZSIsDQogICAgICAgICAgICB0YXhfYWdncmVnYXRlID0gIlNwZWNpZXMiLA0KICAgICAgICAgICAgdGF4X3Nob3cgPSAxMiwNCiAgICAgICAgICAgIG5vcm1hbGlzZSA9IEZBTFNFLA0KICAgICAgICAgICAgdGF4X2VtcHR5ID0gImJlc3QiLA0KICAgICAgICAgICAgdGF4X2FkZCA9ICJGYW1pbHkiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGdndGl0bGUoIkRpZmZlcmVudGlhbGx5IGFidW5kYW50IHZpcmFsIHNwZWNpZXMiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KQ0KDQpgYGANCg0KIyMjIFZpcmFsIGhvc3RzDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZz1GfQ0KDQpQU1YucmVsIDwtIG1pY3JvYmlvbWU6OnRyYW5zZm9ybShQU1YuaG9zdCwgImNvbXBvc2l0aW9uYWwiKQ0KDQpQU1YuZGlmZi5yZWwgPC0gbWVyZ2VfcGh5bG9zZXEoc3Vic2V0KG90dV90YWJsZShQU1YucmVsKSwgcm93bmFtZXMob3R1X3RhYmxlKFBTVi5yZWwpKSAlaW4lIHJvd25hbWVzKHNpZ3RhYikpLHBoeWxvc2VxOjp0YXhfdGFibGUoUFNWLnJlbCksIHNhbXBsZV9kYXRhKFBTVi5yZWwpKQ0KDQoNCiNnbG9tIDwtIHRheF9nbG9tKHN1YnNldF90YXhhKFBTVi5kaWZmLCBLaW5nZG9tICE9ICIiKSwgIlNwZWNpZXMiLCBOQXJtID0gRkFMU0UpDQoNCiNSZW1vdmUgUmVhbG0gZnJvbSBwaHlsb3NlcTo6dGF4X3RhYmxlDQojUFNWLmRpZmYucmVsQHRheF90YWJsZSA8LSBwaHlsb3NlcTo6dGF4X3RhYmxlKFBTVi5kaWZmLnJlbClbLGMoMSwzOjgpXQ0KDQphbXB2aXMyX1BTVi5kaWZmLnJlbCA8LSBhbXB2aXMyOjphbXBfbG9hZChQU1YuZGlmZi5yZWwpICNDb252ZXJ0IHBoeWxvc2VxIHRvIGFtcHZpczIgb2JqZWN0DQoNCmFtcHZpczJfUFNWLmRpZmYucmVsJGFidW5kIDwtIGFtcHZpczJfUFNWLmRpZmYucmVsJGFidW5kKjEwMCAjTXVsdGlwbHkgcmVsYXRpdmUgYWJ1bmRhbmNlIGJ5IDEwMCBmb3IgcmVhZCBwZXJjZW50YWdlDQoNCmRlc2VxMl9hbXBfc2dhX3Zpcl9ob3N0IDwtIGFtcF9oZWF0bWFwKGFtcHZpczJfUFNWLmRpZmYucmVsLA0KICAgICAgICAgICAgZ3JvdXBfYnkgPSAiU21hbGxfZm9yX2dlc3RhdGlvbmFsX2FnZSIsDQogICAgICAgICAgICB0YXhfYWdncmVnYXRlID0gIkdlbnVzIiwNCiAgICAgICAgICAgIHRheF9zaG93ID0gMTEsDQogICAgICAgICAgICBub3JtYWxpc2UgPSBGQUxTRSwNCiAgICAgICAgICAgIHRheF9lbXB0eSA9ICJiZXN0IiwNCiAgICAgICAgICAgIHRheF9hZGQgPSAiRmFtaWx5IikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBnZ3RpdGxlKCJWaXJhbCBob3N0IikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldikNCg0KZGVzZXEyX2FtcF9zZ2FfdmlyX2hvc3QNCmBgYA0KDQojIENyb3NzIGNvcnJlbGF0aW9uIA0KDQojIyByQ0NBDQoNCiMjIyBDb252ZXJzaW9uIGFuZCBzY3JlZXBsb3QNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IFQsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD00LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCiNTdWJzZXQgc2FtcGxlcyBwcmVzZW50IGluIGJvdGgNCnZpcl9pZHMgPC0gUFNWQHNhbV9kYXRhJGRlc2NyaXB0aW9uICU+JSBzdHJfc3BsaXRfaSgiXyIsLTEpDQpQU1ZAc2FtX2RhdGEkaWQgPC0gdmlyX2lkcw0KDQpQU0IuQ1NTLmJvdGggPC0gc3Vic2V0X3NhbXBsZXMoUFNCLGRlc2NyaXB0aW9uICVpbiUgdmlyX2lkcykNCiNQU1YuQ1NTLmJvdGggPC0gc3Vic2V0X3NhbXBsZXMoUFNWLkNTUyx2aXJfaWRzICVpbiUgUFNCLkNTUy5ib3RoQHNhbV9kYXRhJGRlc2NyaXB0aW9uKQ0KUFNWLkNTUy5ob3N0LmJvdGggPC0gc3Vic2V0X3NhbXBsZXMoUFNWLkNTUy5ob3N0LHZpcl9pZHMgJWluJSBQU0IuQ1NTLmJvdGhAc2FtX2RhdGEkZGVzY3JpcHRpb24pDQoNCiMjVHJhbnNwb3NlIGFuZCBjb252ZXJ0IHRvIGRhdGFmcmFtZXMNCmJvdHUgPC0gZGF0YS5mcmFtZShQU0IuQ1NTLmJvdGhAb3R1X3RhYmxlKQ0KI1NlbGVjdCBsYXN0IG5vbi1lbXB0eSB0YXhvbm9taWMgcmFuaw0KdGF4LmJhYyA8LSBhcy5kYXRhLmZyYW1lKFBTQi5DU1MuYm90aEB0YXhfdGFibGUpICU+JSBkcGx5cjo6bXV0YXRlX2FsbCh+bmFfaWYoLiwgJycpKSAlPiUgYXBwbHkoLiwxLCBmdW5jdGlvbih4KSB0YWlsKHN0YXRzOjpuYS5vbWl0KHgpLCAxKSkNCnJvd25hbWVzKGJvdHUpIDwtIHBhc3RlKHJvd25hbWVzKGJvdHUpLHRheC5iYWMsIHNlcCA9ICItIikNCg0Kdm90dSA8LSBkYXRhLmZyYW1lKFBTVi5DU1MuaG9zdC5ib3RoQG90dV90YWJsZSkNCiNTZWxlY3QgbGFzdCBub24tZW1wdHkgdGF4b25vbWljIHJhbmsNCnRheC52aXIgPC0gYXMuZGF0YS5mcmFtZShQU1YuQ1NTLmhvc3QuYm90aEB0YXhfdGFibGUpICU+JSBkcGx5cjo6bXV0YXRlX2FsbCh+bmFfaWYoLiwgJycpKSAlPiUgYXBwbHkoLiwxLCBmdW5jdGlvbih4KSB0YWlsKHN0YXRzOjpuYS5vbWl0KHgpLCAxKSkNCnJvd25hbWVzKHZvdHUpIDwtIHBhc3RlKHJvd25hbWVzKHZvdHUpLHRheC52aXIsIHNlcCA9ICItIikNCg0KDQogICMjIyMjIyMjIyMjQ29udmVydCB0byBtYXRyaXggYW5kIHRyYW5zcG9zZSAtIE1heWJlIHNraXA/DQp0KGFzLm1hdHJpeC5kYXRhLmZyYW1lKGJvdHUpKS0+dG1iYWN0ZXJpYQ0KICAjU2F2ZSBPVFUgVGF4b25vbXkgZnJvbSBoZWFkZXINCnRtY29sbmFtZXMgPC0gY29sbmFtZXModG1iYWN0ZXJpYSkNCiAgI1JlbW92ZSBmaXJzdCBsaW5lDQpyb3duYW1lcyh0bWJhY3RlcmlhKSA8LSBOVUxMDQogICNBcHBseSBhcy5udW1lcmljIHRvIG1hdHJpeCh3aWxsIHJlbW92ZSBoZWFkZXIgYXMgaXQgaXMgaW4gY2hhcmFjdGVycykNCm5iYWN0ZXJpYSA8LSBtYXBwbHkodG1iYWN0ZXJpYSwgRlVOPWFzLm51bWVyaWMpDQogICNDb252ZXJ0IGJhY2sgaW50byBtYXRyaXggYW5kIGFkZCBjb2xuYW1lcw0KbWJhY3RlcmlhIDwtIG1hdHJpeChuYmFjdGVyaWEsIG5jb2w9TkNPTCh0bWJhY3RlcmlhKSwgbnJvdz1OUk9XKHRtYmFjdGVyaWEpKQ0KY29sbmFtZXMobWJhY3RlcmlhKSA8LSB0bWNvbG5hbWVzDQoNCiAgDQogICAgIyNSZXBlYXQgZm9yIHZpcmFsIE9UVSB0YWJsZQ0KdChhcy5tYXRyaXguZGF0YS5mcmFtZSh2b3R1KSktPnRtdmlyb21lDQp0bWNvbG5hbWVzIDwtIGNvbG5hbWVzKHRtdmlyb21lKQ0Kcm93bmFtZXModG12aXJvbWUpIDwtIE5VTEwNCm52aXJvbWUgPC0gbWFwcGx5KHRtdmlyb21lLCBGVU49YXMubnVtZXJpYykNCm12aXJvbWUgPC0gbWF0cml4KG52aXJvbWUsIG5jb2w9TkNPTCh0bXZpcm9tZSksIG5yb3c9TlJPVyh0bXZpcm9tZSkpDQpjb2xuYW1lcyhtdmlyb21lKSA8LSB0bWNvbG5hbWVzDQogICAgIyNBbHRlcm5hdGl2ZWx5IHVzZTogZGF0YS5tYXRyaXgoZnJhbWUsIHJvd25hbWVzLmZvcmNlID0gTkEpDQoNCiAgICAjI0NvbnZlcnRpbmcgYW5kIHJlbW92aW5nIG5lYXItemVybyB2YXJpYW5jZSB2YWx1ZXMNCmJhYyA8LSBtYmFjdGVyaWFbLC1jKDEpXQ0Kbnp2IDwtIG5lYXJaZXJvVmFyKGJhYykNCmJhYyA8LSBiYWNbLCAtbnp2JFBvc2l0aW9uXQ0KICAgICAgICAgICANCiAgICAgICAgICAgDQp2aXIgPC0gbXZpcm9tZVssLWMoMSldDQojbnp2IDwtIG5lYXJaZXJvVmFyKHZpcikgIyBJZiBhbnkNCiN2aXIgPC0gdmlyWywgLW56diRQb3NpdGlvbl0NCg0KDQogICNQQ0ENCmxpYnJhcnkodmVnYW4pDQptb2RfYmFjIDwtIHJkYShiYWMsIHNjYWxlID0gVFJVRSkNCnBsb3QobW9kX2JhYywgc2NhbGluZyA9IDMpDQpzY3JlZXBsb3QobW9kX2JhYykNCm1vZF92aXIgPC0gcmRhKHZpciwgc2NhbGUgPSBUUlVFKQ0KcGxvdChtb2RfdmlyLCBzY2FsaW5nID0gMykNCnNjcmVlcGxvdChtb2RfdmlyKQ0KDQpzY2FsaW5nID0gInNocmlua2FnZSINCiAgI0FwcGx5IHNjYWxpbmcgDQpyZXN1bHRfMWNvbXAgPC0gcmNjKGJhYywgdmlyLCBtZXRob2QgPSBzY2FsaW5nLCBuY29tcCA9IDEpDQpyZXN1bHRfMmNvbXAgPC0gcmNjKGJhYywgdmlyLCBtZXRob2QgPSBzY2FsaW5nLCBuY29tcCA9IDIpDQpyZXN1bHRfM2NvbXAgPC0gcmNjKGJhYywgdmlyLCBtZXRob2QgPSBzY2FsaW5nLCBuY29tcCA9IDMpDQpyZXN1bHRfNGNvbXAgPC0gcmNjKGJhYywgdmlyLCBtZXRob2QgPSBzY2FsaW5nLCBuY29tcCA9IDQpDQoNCmdnYXJyYW5nZShwbG90KHJlc3VsdF8xY29tcCwgdHlwZSA9ICJiYXJwbG90IiksDQogICAgICAgICAgcGxvdChyZXN1bHRfMmNvbXAsIHR5cGUgPSAiYmFycGxvdCIpLA0KICAgICAgICAgIHBsb3QocmVzdWx0XzNjb21wLCB0eXBlID0gImJhcnBsb3QiKSwNCiAgICAgICAgICBwbG90KHJlc3VsdF80Y29tcCwgdHlwZSA9ICJiYXJwbG90IikNCiAgICAgICAgICAsbnJvdyA9IDIpDQoNCiMgcHJvZHVjZSBhIGhlYXQgbWFwIG9mIHRoZSBjcm9zcyBjb3JyZWxhdGlvbiBtYXRyaXgNCmltZ0NvcihiYWMsIHZpciwgc2lkZUNvbG9ycyA9IGMoInB1cnBsZSIsICJncmVlbiIpKSANCmBgYA0KDQojIyMgTW9kZWwgdHVuaW5nDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBULCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQojIHNldCBncmlkIHNlYXJjaCB2YWx1ZXMgZm9yIGVhY2ggcmVndWxhcmlzYXRpb24gcGFyYW1ldGVyDQpncmlkMSA8LSBzZXEoMC4wMDEsIDAuMiwgbGVuZ3RoID0gMjApIA0KZ3JpZDIgPC0gc2VxKDAuMDAxLCAwLjIsIGxlbmd0aCA9IDIwKQ0KDQojIG9wdGltaXNlIHRoZSByZWd1bGFyaXNhdGlvbiBwYXJhbWV0ZXIgdmFsdWVzDQpzbChjdi50dW5lLnJjYywgdHVuZS5yY2MoYmFjLCB2aXIsIGdyaWQxID0gZ3JpZDEsIGdyaWQyID0gZ3JpZDIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uID0gImxvbyIpLG92ZXJ3cml0ZSA9IEYpDQoNCiMgZXhhbWluZSB0aGUgcmVzdWx0cyBvZiBDViB0dW5pbmcNCnBsb3QoY3YudHVuZS5yY2MpDQpjdi50dW5lLnJjYw0KDQojbWFudWFsbHkgc2V0IGxhbWJkYSBzY29yZXMNCiNvcHQubDEgPC0gMS43DQojb3B0LmwyIDwtIDAuMDAzDQpvcHQubDEgPC0gY3YudHVuZS5yY2Mkb3B0LmxhbWJkYTENCm9wdC5sMiA8LSBjdi50dW5lLnJjYyRvcHQubGFtYmRhMg0KYGBgDQoNCiMjIyBNb2RlbCBhbmQgY29tcG9uZW50IHNlbGVjdGlvbg0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gVCwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0Kc2hyaW5rLnJjYyA8LSByY2MoYmFjLCB2aXIsIG1ldGhvZCA9ICJzaHJpbmthZ2UiKQ0KDQpDVi5yY2MgPC0gcmNjKGJhYywgdmlyLCBtZXRob2QgPSAicmlkZ2UiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGExID0gb3B0LmwxLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTIgPSBvcHQubDIpIA0KDQojIGJhcnBsb3Qgb2YgY3Jvc3MgdmFsaWRhdGlvbiBtZXRob2QgckNDQSBjYW5vbmljYWwgY29ycmVsYXRpb25zDQpwbG90KENWLnJjYywgdHlwZSA9ICJiYXJwbG90IiwgbWFpbiA9ICJDcm9zcyBWYWxpZGF0aW9uIikgDQoNCiMgYmFycGxvdCBvZiBzaHJpbmthZ2UgbWV0aG9kIHJDQ0EgY2Fub25pY2FsIGNvcnJlbGF0aW9ucw0KcGxvdChzaHJpbmsucmNjLCB0eXBlID0gImJhcnBsb3QiLCBtYWluID0gIlNocmlua2FnZSIpDQpgYGANCg0KIyMjIFJ1biBtb2RlbA0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gVCwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KI1BlcmZyb20gb3B0aW1pc2VkIENWIHJDQ0ENCg0KcmVzdWx0LkNWIDwtIHJjYyhiYWMsIHZpciwgbWV0aG9kID0gInJpZGdlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGExID0gb3B0LmwxLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTIgPSBvcHQubDIsDQogICAgICAgICAgICAgIG5jb21wPTMpDQoNCnJlc3VsdC5yYXcgPC0gcmNjKGJhYywgdmlyLCBtZXRob2QgPSAic2hyaW5rYWdlIixuY29tcD0zKQ0KDQojUmVtb3ZlIE9UVSBJRHMgdG8gb25seSBzaG93IHRheG9ub215DQpyZXN1bHQgPC0gcmVzdWx0LnJhdw0KDQpyZXN1bHQkbmFtZXMkY29sbmFtZXMkWCA8LSBnc3ViKCIuKlxcLSIsICIiLCByZXN1bHQkbmFtZXMkY29sbmFtZXMkWCkgJT4lIG1ha2UudW5pcXVlKHNlcD0iXyIpDQpyZXN1bHQkbmFtZXMkY29sbmFtZXMkWSA8LSBnc3ViKCIuKlxcLSIsICIiLCByZXN1bHQkbmFtZXMkY29sbmFtZXMkWSkgJT4lIG1ha2UudW5pcXVlKHNlcD0iXyIpDQoNCg0KIyBjb2xuYW1lcyhyZXN1bHQkWCkgPC0gZ3N1YigiLipcXC0iLCAiIiwgY29sbmFtZXMocmVzdWx0JFgpKQ0KIyBjb2xuYW1lcyhyZXN1bHQkWSkgPC0gZ3N1YigiLipcXC0iLCAiIiwgY29sbmFtZXMocmVzdWx0JFkpKQ0KDQojIHJvd25hbWVzKHJlc3VsdCRsb2FkaW5ncyRYKSA8LSBnc3ViKCIuKlxcLSIsICIiLCByb3duYW1lcyhyZXN1bHQkbG9hZGluZ3MkWCkpDQojIHJvd25hbWVzKHJlc3VsdCRsb2FkaW5ncyRZKSA8LSBnc3ViKCIuKlxcLSIsICIiLCByb3duYW1lcyhyZXN1bHQkbG9hZGluZ3MkWSkpDQoNCg0KYGBgDQoNCiMjIyBWaXN1YWxpemF0aW9uDQoNCiMjIyMgSGVhdG1hcHMgDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBULCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCiNEZWZuZSBwYWxsZXR0ZSB0byBvbmx5IGFkZCBjb2xvdXIgdG8gb25seSBoaWdoDQojI0dlbmVyYXRlIG5ldyBwYWxsZXR0ZQ0KcGFsZXR0ZSA8LSBoY2wuY29sb3JzKDIwMCwgcGFsZXR0ZSA9ICJaaXNzb3UgMSIsIGFscGhhID0gTlVMTCwgcmV2ID0gRkFMU0UsIGZpeHVwID0gVFJVRSkgI1NlY2xlY3QgcGFsZXR0ZSBodHRwczovL2RldmVsb3Blci5yLXByb2plY3Qub3JnL0Jsb2cvcHVibGljLzIwMTkvMDQvMDEvaGNsLWJhc2VkLWNvbG9yLXBhbGV0dGVzLWluLWdyZGV2aWNlcy8NCnBhbGV0dGVbNjE6MTQwXSA8LSAid2hpdGUiICNTZWxlY3Qgd2hpY2ggcGFydCBvZiBwYWxsZXR0ZSB0byByZXBsYWNlIHdpdGggd2hpdGUNCg0KIyBoaWdoNF8yYyA8LSBjaW0ocmVzdWx0LCBjb21wID0gMToyLCB5bGFiID0gIkJhY3RlcmlhIiwgeGxhYiA9ICJWaXJvbWUiLCBtYXJnaW5zID0gYygxMiwxOCksY3V0b2ZmID0gMC40LCBjb2xvciA9IHBhbGV0dGUpDQojIGhpZ2g0NV8yYyA8LSBjaW0ocmVzdWx0LCBjb21wID0gMToyLCB5bGFiID0gIkJhY3RlcmlhIiwgeGxhYiA9ICJWaXJvbWUiLCBtYXJnaW5zID0gYygxMiwxOCksY3V0b2ZmID0gMC40NSwgY29sb3IgPSBwYWxldHRlKQ0KI2hpZ2g1XzNjIDwtIGNpbShyZXN1bHQsIGNvbXAgPSAxOjIsIHlsYWIgPSAiQmFjdGVyaWEiLCB4bGFiID0gIlZpcm9tZSIsIG1hcmdpbnMgPSBjKDEyLDE4KSxjdXRvZmYgPSAwLjUsIGNvbG9yID0gcGFsZXR0ZSkNCg0KI3BkZihmaWxlbmFtZT0iaGlnaDVfM2MucGRmIiwgcmVzID0gNjAwLCB3aWR0aCA9IDQwMDAsIGhlaWdodCA9IDQwMDApDQojaGlnaDVfM2MNCiNkZXYub2ZmKCkNCg0KIyMjIyMjDQoNCmhpZ2g2XzNjIDwtIGNpbShyZXN1bHQsIGNvbXAgPSAxOjMsIHlsYWIgPSAiQmFjdGVyaWEiLCB4bGFiID0gIlZpcm9tZSBob3N0IHByZWRpY3Rpb24iLCBtYXJnaW5zID0gYyg3LDkpLGN1dG9mZiA9IDAuNiwgY29sb3IgPSBwYWxldHRlKQ0KaGlnaDVfM2MgPC0gY2ltKHJlc3VsdCwgY29tcCA9IDE6MywgeWxhYiA9ICJCYWN0ZXJpYSIsIHhsYWIgPSAiVmlyb21lIGhvc3QgcHJlZGljdGlvbiIsIG1hcmdpbnMgPSBjKDcsOSksY3V0b2ZmID0gMC41LCBjb2xvciA9IHBhbGV0dGUpDQpoaWdoNDVfM2M8LSBjaW0ocmVzdWx0LCBjb21wID0gMTozLCB5bGFiID0gIkJhY3RlcmlhIiwgeGxhYiA9ICJWaXJvbWUgaG9zdCBwcmVkaWN0aW9uIiwgbWFyZ2lucyA9IGMoMTUsMjApLGN1dG9mZiA9IDAuNDUsIGNvbG9yID0gcGFsZXR0ZSkNCmhpZ2g0XzNjIDwtIGNpbShyZXN1bHQsIGNvbXAgPSAxOjMsIHlsYWIgPSAiQmFjdGVyaWEiLCB4bGFiID0gIlZpcm9tZSBob3N0IHByZWRpY3Rpb24iLCBtYXJnaW5zID0gYygxNSwyMCksY3V0b2ZmID0gMC40LCBjb2xvciA9IHBhbGV0dGUpDQoNCiNtYXQ1IDwtIGhpZ2g1XzJjJG1hdA0KbWF0Nl8zYyA8LSBoaWdoNl8zYyRtYXQNCm1hdDQ1XzNjIDwtIGhpZ2g0NV8zYyRtYXQNCm1hdDRfM2MgPC0gaGlnaDRfM2MkbWF0DQogIA0KICNPdXRwdXQgTWF0cml4DQp3cml0ZS50YWJsZShtYXQ0NV8zYywgIk1hdHJpeF9oaWdoXzMtQ29tcG9uZW50XzAuNDUudHh0Iiwgc2VwPSJcdCIpDQoNCiNNYWtlIGxpbmVhciBwbG90cyBvZiBhbGwgYmFjIGFuZCB2aXIgDQpiYWNtYXQ2XzNjIDwtIGJhY1sscm93bmFtZXMobWF0Nl8zYyldDQp2aXJtYXQ2XzNjIDwtIHZpclssY29sbmFtZXMobWF0Nl8zYyldDQpiYWN2aXJtYXQ2XzNjIDwtIGNiaW5kKGJhY21hdDZfM2MsdmlybWF0Nl8zYykNCmJhYzQ1XzNjIDwtIGJhY1sscm93bmFtZXMobWF0NDVfM2MpXQ0KdmlyNDVfM2MgPC0gdmlyWyxjb2xuYW1lcyhtYXQ0NV8zYyldDQpiYWN2aXJtYXQ0NV8zYyA8LSBjYmluZChiYWM0NV8zYyx2aXI0NV8zYykNCg0KI2dncGFpcnMNCmxpYnJhcnkoR0dhbGx5KQ0KI2dncGFpcnMoYmFjdmlyKQ0KI2dncGFpcnMoYmFjdmlyNDUsY29sdW1ucz0zOjEzKQ0KI2dncGFpcnMoYXMuZGF0YS5mcmFtZShiYWN2aXI0NSkpDQpzbChwYWlyczQ1LGdncGFpcnMoYXMuZGF0YS5mcmFtZShiYWN2aXJtYXQ0NV8zYykpKQ0Kc2wocGFpcnM2LGdncGFpcnMoYXMuZGF0YS5mcmFtZShiYWN2aXJtYXQ2XzNjKSkpDQoNCiMgcGFpcnM0NSArDQojICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAtOTAsIGhqdXN0ID0gMCwgdmp1c3Q9MC41KSkgDQoNCiNwYWlyczYgKw0KIyAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gLTkwLCBoanVzdCA9IDAsIHZqdXN0PTAuNSkpIA0KYGBgDQoNCiMjIyMgTmV0d29yayBwbG90cw0KDQojIyMjIyBTaHJpbmthZ2UNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IFQsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCiMgUmVmb3JtYXQgZm9yIGdlcGhpDQoNCiMjIFNhdmUgYmxvY2tzIGFzIHBvbHlnb24gdG8gZGV0ZXJtaW5lIHNoYXBlIGluIG5ldHdvcmsNCg0KcmVzdWx0JG5hbWVzJFBvbHlnb24gPC0gcmVzdWx0JG5hbWVzJGRhdGENCnJlc3VsdCRuYW1lcyRQb2x5Z29uIDwtIHJlcGxhY2UocmVzdWx0JG5hbWVzJGRhdGEsIGMoImJhYyIsInZpciIpLGMoMyw0KSkgJT4lIGFzLmludGVnZXIoKQ0KDQojIyBSZW1vdmUgdWJpcXVlIG1hcmtlcnMgdG8gYWxsb3cgc2hhcmVkIGNvbG9yaW5nIGluIEdlcGhpDQpyZXN1bHQkbmFtZXNfc2ltcGxlJGNvbG5hbWVzJFggPC0gZ3N1YigiKi5cXF8iLCAiIiwgcmVzdWx0JG5hbWVzJGNvbG5hbWVzJFgpDQpyZXN1bHQkbmFtZXNfc2ltcGxlJGNvbG5hbWVzJFkgPC0gZ3N1YigiKi5cXF8iLCAiIiwgcmVzdWx0JG5hbWVzJGNvbG5hbWVzJFkpDQoNCiNTaG93IG5ldHdvcmsNCg0KbmV0d29yayhyZXN1bHQsIGNvbXAgPSAxOjMsIGludGVyYWN0aXZlID0gRkFMU0UsDQogICAgICAgIGx3ZC5lZGdlID0gMiwNCiAgICAgICAgY2V4Lm5vZGUubmFtZSA9IDE0LA0KICAgICAgICBjdXRvZmYgPSAwLjMsDQogICAgICAgIGNvbG9yLm5vZGUgPSBjb2xfZmlsWzE6Ml0pIA0KDQpuZXR3b3JrKHJlc3VsdCwgY29tcCA9IDE6MywgaW50ZXJhY3RpdmUgPSBGQUxTRSwNCiAgICAgICAgbHdkLmVkZ2UgPSAyLA0KICAgICAgICBjdXRvZmYgPSAwLjQsDQogICAgICAgIGNvbG9yLm5vZGUgPSBjb2xfZmlsWzE6Ml0pIA0KDQpuZXR3b3JrKHJlc3VsdCwgY29tcCA9IDE6MywgaW50ZXJhY3RpdmUgPSBGQUxTRSwNCiAgICAgICAgbHdkLmVkZ2UgPSAyLA0KICAgICAgICBjdXRvZmYgPSAwLjUsDQogICAgICAgIGNvbG9yLm5vZGUgPSBjb2xfZmlsWzE6Ml0pIA0KDQojRXhwb3J0IG5ldHdvcmsgcmVzdWx0DQpuZXR3b3JrLnJlcyA8LSBuZXR3b3JrKHJlc3VsdCwgY29tcCA9IDE6MywgaW50ZXJhY3RpdmUgPSBGQUxTRSwNCiAgICAgICAgbHdkLmVkZ2UgPSAyLA0KICAgICAgICBjdXRvZmYgPSAwLjMwLA0KICAgICAgICBjb2xvci5ub2RlID0gY29sX2ZpbFsxOjJdKQ0KDQpsaWJyYXJ5KGlncmFwaCkNCg0KI25ldHdvcmsucmVzIA0KDQp3cml0ZS5ncmFwaChuZXR3b3JrLnJlcyRnUiwgZmlsZSA9ICJuZXR3b3JrLnNocmlua2FnZTAuMy5nbWwiLCBmb3JtYXQgPSAiZ21sIikNCmBgYA0KDQojIyMjIyBDVg0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gVCwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTYsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KcmVzdWx0LkNWJG5hbWVzX3NpbXBsZSRjb2xuYW1lcyRYIDwtIGdzdWIoIiouXFxfIiwgIiIsIHJlc3VsdC5DViRuYW1lcyRjb2xuYW1lcyRYKQ0KcmVzdWx0LkNWJG5hbWVzX3NpbXBsZSRjb2xuYW1lcyRZIDwtIGdzdWIoIiouXFxfIiwgIiIsIHJlc3VsdC5DViRuYW1lcyRjb2xuYW1lcyRZKQ0KDQojU2hvdyBuZXR3b3JrDQpuZXR3b3JrKHJlc3VsdC5DViwgY29tcCA9IDE6MywgaW50ZXJhY3RpdmUgPSBGQUxTRSwNCiAgICAgICAgbHdkLmVkZ2UgPSAyLA0KICAgICAgICBjdXRvZmYgPSAwLjMsDQogICAgICAgIGNvbG9yLm5vZGUgPSBjb2xfZmlsWzE6Ml0pIA0KDQpuZXR3b3JrKHJlc3VsdC5DViwgY29tcCA9IDE6MywgaW50ZXJhY3RpdmUgPSBGQUxTRSwNCiAgICAgICAgbHdkLmVkZ2UgPSAyLA0KICAgICAgICBjdXRvZmYgPSAwLjM1LA0KICAgICAgICBjb2xvci5ub2RlID0gY29sX2ZpbFsxOjJdKSANCg0KIyBuZXR3b3JrKHJlc3VsdC5DViwgY29tcCA9IDE6MywgaW50ZXJhY3RpdmUgPSBGQUxTRSwNCiMgICAgICAgICBsd2QuZWRnZSA9IDIsDQojICAgICAgICAgY3V0b2ZmID0gMC41LA0KIyAgICAgICAgIGNvbG9yLm5vZGUgPSBjb2xfZmlsWzE6Ml0pIA0KDQoNCmxpYnJhcnkoaWdyYXBoKQ0KbmV0d29yay5yZXMgPC0gbmV0d29yayhyZXN1bHQsIGNvbXAgPSAxOjMsIGludGVyYWN0aXZlID0gRkFMU0UsDQogICAgICAgIGx3ZC5lZGdlID0gMiwNCiAgICAgICAgY3V0b2ZmID0gMC4zMCwNCiAgICAgICAgY29sb3Iubm9kZSA9IGNvbF9maWxbMToyXSkNCg0Kd3JpdGUuZ3JhcGgobmV0d29yay5yZXMkZ1IsIGZpbGUgPSAibmV0d29yay5DVjAuMy5nbWwiLCBmb3JtYXQgPSAiZ21sIikNCmBgYA0KDQojIyBQUk9DcnVzdGVzIGNvbXBhcmlzb24gbWF0cml4IGNvcnJlbGF0aW9uIHF1YW50aWZpY2F0aW9ucw0KDQojIyMgU3Vic2V0IG1hdHJpY2VzDQoNCmBgYHtyfQ0KYmFjMCA8LSBiYWNbd2hpY2goUFNCLkNTUy5ib3RoQHNhbV9kYXRhJFRpbWUgPT0gIlQwIiksXSAlPiUgdCgpDQp2aXIwIDwtIHZpclt3aGljaChQU1YuQ1NTLmhvc3QuYm90aEBzYW1fZGF0YSRUaW1lID09ICJUMCIpLF0gJT4lIHQoKQ0KDQpiYWMxNSA8LSBiYWNbd2hpY2goUFNCLkNTUy5ib3RoQHNhbV9kYXRhJFRpbWUgPT0gIlQxIiksXSAlPiUgdCgpDQp2aXIxNSA8LSB2aXJbd2hpY2goUFNWLkNTUy5ob3N0LmJvdGhAc2FtX2RhdGEkVGltZSA9PSAiVDEiKSxdICU+JSB0KCkNCg0KYmFjMzAgPC0gYmFjW3doaWNoKFBTQi5DU1MuYm90aEBzYW1fZGF0YSRUaW1lID09ICJUMiIpLF0gJT4lIHQoKQ0KdmlyMzAgPC0gdmlyW3doaWNoKFBTVi5DU1MuaG9zdC5ib3RoQHNhbV9kYXRhJFRpbWUgPT0gIlQyIiksXSAlPiUgdCgpDQoNCmJhYzkwIDwtIGJhY1t3aGljaChQU0IuQ1NTLmJvdGhAc2FtX2RhdGEkVGltZSA9PSAiVDMiKSxdICU+JSB0KCkNCnZpcjkwIDwtIHZpclt3aGljaChQU1YuQ1NTLmhvc3QuYm90aEBzYW1fZGF0YSRUaW1lID09ICJUMyIpLF0gJT4lIHQoKQ0KDQpkYXRhIDwtIGxpc3QoYmFjMCxiYWMxNSxiYWMzMCxiYWM5MCx2aXIwLHZpcjE1LHZpcjMwLHZpcjkwKQ0KYGBgDQoNCiMjIyBQQ29Bcw0KDQpgYGB7cn0NCmdldF9wY29hIDwtIGZ1bmN0aW9uKHBzPSJQU0IuQ1NTIil7DQoNCm90dSA8LSBkYXRhLmZyYW1lKHBzQG90dV90YWJsZSkgJT4lIHQoKQ0KYnJheSA8LSB2ZWdhbjo6dmVnZGlzdChvdHUsIG1ldGhvZCA9ICJicmF5IikNCmFkZCA8LSAgIShhZGU0Ojppcy5ldWNsaWQoYnJheSkpDQpwY29hIDwtIGNtZHNjYWxlKGJyYXksIGsgPSBucm93KG90dSktMSwgZWlnID0gVFJVRSwgYWRkID0gYWRkKQ0KIw0KcmV0dXJuKHBjb2EpDQp9DQoNCnBjb2EuYmFjIDwtIGdldF9wY29hKFBTQi5DU1MuYm90aCkNCnZlZ2FuOjpvcmRpcGxvdChwY29hLmJhYywgdHlwZSA9ICJ0ZXh0IiwgbWFpbiA9ICJQQ29BIGZvciBCYWN0ZXJpYSBEYXRhLCBCcmF5IERpc3RhbmNlcyIpDQpwY29hLnZpciA8LSBnZXRfcGNvYShQU1YuQ1NTLmhvc3QuYm90aCkNCnZlZ2FuOjpvcmRpcGxvdChwY29hLnZpciwgdHlwZSA9ICJ0ZXh0IiwgbWFpbiA9ICJQQ29BIGZvciBWaXJhbCBEYXRhLCBCcmF5IERpc3RhbmNlcyIpDQpgYGANCg0KIyMjIFByb2NydXN0ZXMNCg0KIyMjIyBBbGwgc2FtcGxlcw0KDQpgYGB7ciwgd2FybmluZyA9IEZ9DQojQWxsIHRpbWUgcG9pbnRzDQpwY29hLmJhYyA8LSBQU0IuQ1NTLmJvdGggJT4lIGdldF9wY29hKCkNCnBjb2EudmlyIDwtIFBTVi5DU1MuaG9zdC5ib3RoICU+JSBnZXRfcGNvYSgpDQoNCnNsKHByb2NydXN0ZXMudGVzdC5hbGwsdmVnYW46OnByb3Rlc3QoWCA9IHBjb2EuYmFjLCBZID0gcGNvYS52aXIsIHNjb3JlcyA9ICJzaXRlcyIsIHN5bW1ldHJpYyA9IFQsIHBlcm11dGF0aW9ucyA9IDk5OTk5OSksIG92ZXJ3cml0ZSA9IEYpDQoNCnByb2NydXN0ZXMudGVzdC5hbGwNCmBgYA0KDQojIyMjIFBlciB0aW1lIHBvaW50DQoNCmBgYHtyfQ0KI0luZGl2aWR1YWwgdGltZSBwb2ludHMNCnBjb2EuYmFjMCA8LSBQU0IuQ1NTLmJvdGggJT4lIHN1YnNldF9zYW1wbGVzKERheXMgPT0gMSkgJT4lIG90dV90YWJsZSgpICU+JSBhcy5tYXRyaXgoKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSBmaWx0ZXIocm93U3VtcyguKSAhPSAwKSAlPiUgdCgpICU+JSB2ZWdhbjo6dmVnZGlzdChtZXRob2Q9ImJyYXkiKSAlPiUgdmVnYW46OndjbWRzY2FsZShlaWcgPSBUUlVFKQ0KcGNvYS5iYWMxNSA8LSBQU0IuQ1NTLmJvdGggJT4lIHN1YnNldF9zYW1wbGVzKERheXMgPT0gMTUpICU+JSBvdHVfdGFibGUoKSAlPiUgYXMubWF0cml4KCkgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgZmlsdGVyKHJvd1N1bXMoLikgIT0gMCkgJT4lIHQoKSAlPiUgdmVnYW46OnZlZ2Rpc3QobWV0aG9kPSJicmF5IikgJT4lIHZlZ2FuOjp3Y21kc2NhbGUoZWlnID0gVFJVRSkNCnBjb2EuYmFjMzAgPC0gUFNCLkNTUy5ib3RoICU+JSBzdWJzZXRfc2FtcGxlcyhEYXlzID09IDMwKSAlPiUgb3R1X3RhYmxlKCkgJT4lIGFzLm1hdHJpeCgpICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIGZpbHRlcihyb3dTdW1zKC4pICE9IDApICU+JSB0KCkgJT4lIHZlZ2FuOjp2ZWdkaXN0KG1ldGhvZD0iYnJheSIpICU+JSB2ZWdhbjo6d2NtZHNjYWxlKGVpZyA9IFRSVUUpDQpwY29hLmJhYzkwIDwtIFBTQi5DU1MuYm90aCAlPiUgc3Vic2V0X3NhbXBsZXMoRGF5cyA9PSA5MCkgJT4lIG90dV90YWJsZSgpICU+JSBhcy5tYXRyaXgoKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSBmaWx0ZXIocm93U3VtcyguKSAhPSAwKSAlPiUgdCgpICU+JSB2ZWdhbjo6dmVnZGlzdChtZXRob2Q9ImJyYXkiKSAlPiUgdmVnYW46OndjbWRzY2FsZShlaWcgPSBUUlVFKQ0KDQpwY29hLnZpcjAgPC0gUFNWLkNTUy5ob3N0LmJvdGggJT4lIHN1YnNldF9zYW1wbGVzKERheXMgPT0gMSkgJT4lIG90dV90YWJsZSgpICU+JSBhcy5tYXRyaXgoKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSBmaWx0ZXIocm93U3VtcyguKSAhPSAwKSAlPiUgdCgpICU+JSB2ZWdhbjo6dmVnZGlzdChtZXRob2Q9ImJyYXkiKSAlPiUgdmVnYW46OndjbWRzY2FsZShlaWcgPSBUUlVFKQ0KcGNvYS52aXIxNSA8LSBQU1YuQ1NTLmhvc3QuYm90aCAlPiUgc3Vic2V0X3NhbXBsZXMoRGF5cyA9PSAxNSkgJT4lIG90dV90YWJsZSgpICU+JSBhcy5tYXRyaXgoKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSBmaWx0ZXIocm93U3VtcyguKSAhPSAwKSAlPiUgdCgpICU+JSB2ZWdhbjo6dmVnZGlzdChtZXRob2Q9ImJyYXkiKSAlPiUgdmVnYW46OndjbWRzY2FsZShlaWcgPSBUUlVFKQ0KcGNvYS52aXIzMCA8LSBQU1YuQ1NTLmhvc3QuYm90aCAlPiUgc3Vic2V0X3NhbXBsZXMoRGF5cyA9PSAzMCkgJT4lIG90dV90YWJsZSgpICU+JSBhcy5tYXRyaXgoKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSBmaWx0ZXIocm93U3VtcyguKSAhPSAwKSAlPiUgdCgpICU+JSB2ZWdhbjo6dmVnZGlzdChtZXRob2Q9ImJyYXkiKSAlPiUgdmVnYW46OndjbWRzY2FsZShlaWcgPSBUUlVFKQ0KcGNvYS52aXI5MCA8LSBQU1YuQ1NTLmhvc3QuYm90aCAlPiUgc3Vic2V0X3NhbXBsZXMoRGF5cyA9PSA5MCkgJT4lIG90dV90YWJsZSgpICU+JSBhcy5tYXRyaXgoKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSBmaWx0ZXIocm93U3VtcyguKSAhPSAwKSAlPiUgdCgpICU+JSB2ZWdhbjo6dmVnZGlzdChtZXRob2Q9ImJyYXkiKSAlPiUgdmVnYW46OndjbWRzY2FsZShlaWcgPSBUUlVFKQ0KDQpzbChwcm9jcnVzdGVzLnRlc3QwLHZlZ2FuOjpwcm90ZXN0KFggPSBwY29hLmJhYzAsIFkgPSBwY29hLnZpcjAsIHNjb3JlcyA9ICJzaXRlcyIsIHN5bW1ldHJpYyA9IFQsIHBlcm11dGF0aW9ucyA9IDk5OTk5OSksIG92ZXJ3cml0ZSA9IEYpDQpzbChwcm9jcnVzdGVzLnRlc3QxNSx2ZWdhbjo6cHJvdGVzdChYID0gcGNvYS5iYWMxNSwgWSA9IHBjb2EudmlyMTUsIHNjb3JlcyA9ICJzaXRlcyIsIHN5bW1ldHJpYyA9IFQsIHBlcm11dGF0aW9ucyA9IDk5OTk5OSksIG92ZXJ3cml0ZSA9IEYpDQpzbChwcm9jcnVzdGVzLnRlc3QzMCx2ZWdhbjo6cHJvdGVzdChYID0gcGNvYS5iYWMzMCwgWSA9IHBjb2EudmlyMzAsIHNjb3JlcyA9ICJzaXRlcyIsIHN5bW1ldHJpYyA9IFQsIHBlcm11dGF0aW9ucyA9IDk5OTk5OSksIG92ZXJ3cml0ZSA9IEYpDQpzbChwcm9jcnVzdGVzLnRlc3Q5MCx2ZWdhbjo6cHJvdGVzdChYID0gcGNvYS5iYWM5MCwgWSA9IHBjb2EudmlyOTAsIHNjb3JlcyA9ICJzaXRlcyIsIHN5bW1ldHJpYyA9IFQsIHBlcm11dGF0aW9ucyA9IDk5OTk5OSksIG92ZXJ3cml0ZSA9IEYpDQoNCg0KcHJvY3J1c3Rlcy50ZXN0MA0KcHJvY3J1c3Rlcy50ZXN0MTUNCnByb2NydXN0ZXMudGVzdDMwDQpwcm9jcnVzdGVzLnRlc3Q5MA0KDQojQ29tYmluZSAgcHJvY3J1c3RlcyByZXNzdWx0cyBpbiBkYXRhZnJhbWUNCnRlc3QwIDwtIGMocHJvY3J1c3Rlcy50ZXN0MCRzcyxwcm9jcnVzdGVzLnRlc3QwJHNjYWxlLHByb2NydXN0ZXMudGVzdDAkc2lnbmlmKQ0KdGVzdDE1IDwtIGMocHJvY3J1c3Rlcy50ZXN0MTUkc3MscHJvY3J1c3Rlcy50ZXN0MTUkc2NhbGUscHJvY3J1c3Rlcy50ZXN0MTUkc2lnbmlmKQ0KdGVzdDMwIDwtIGMocHJvY3J1c3Rlcy50ZXN0MzAkc3MscHJvY3J1c3Rlcy50ZXN0MzAkc2NhbGUscHJvY3J1c3Rlcy50ZXN0MzAkc2lnbmlmKQ0KdGVzdDkwIDwtIGMocHJvY3J1c3Rlcy50ZXN0OTAkc3MscHJvY3J1c3Rlcy50ZXN0OTAkc2NhbGUscHJvY3J1c3Rlcy50ZXN0OTAkc2lnbmlmKQ0KDQptIDwtIG1hdHJpeChucm93ID0gMCwgbmNvbCA9MykNCmNvbG5hbWVzKG0pIDwtIGMoIlN1bSBvZiBTcXVhcmVzIiwgIlByb2NydXN0ZXMgQ29ycmVsYXRpb24iLCAiUHIuRiIpDQoNCm0gPC0gcmJpbmQobSx0ZXN0MCx0ZXN0MTUsdGVzdDMwLHRlc3Q5MCkNCm0NCg0Kcm93bmFtZXMobSkgPC0gYygiRGF5IDAiLCAiRGF5IDE1IiwgIkRheSAzMCIsICJEYXkgOTAiKQ0KDQojUHJlcGFyZSBmb3IgcGxvdHRpbmcNCg0KZGF0IDwtIG0gJT4lDQogIGFzLmRhdGEuZnJhbWUoKSAlPiUNCiAgdGliYmxlOjphZGRfY29sdW1uKFZhcmlhYmxlID0gcm93bmFtZXMobSksLm5hbWVfcmVwYWlyID0gIm1pbmltYWwiKSANCg0KI0FkZCBhZGp1c3RlZCBwLXZhbHVlcw0KZGF0JFByLkYuYWRqIDwtIHAuYWRqdXN0KGRhdCRQci5GLCBtZXRob2QgPSAnaG9sbScpDQoNCiNTaG93IHRhYmxlDQoja25pdHI6OmthYmxlKGFub3ZhLmRhdCkNCg0KIyNGYW5jeSBwbG90DQoNCm1lbHQgPC0gdGlkeXI6OnBpdm90X2xvbmdlcihkYXQsY29scz1jKCJQcm9jcnVzdGVzIENvcnJlbGF0aW9uIiksIG5hbWVzX3RvPSdtZWFzdXJlJywgdmFsdWVzX3RvPSJ2YWx1ZSIpICU+JQ0KICBhZGRfc2lnbmlmaWNhbmNlKHAuY29sID0gIlByLkYiLCBvdXRwdXQuY29sID0gIlByRi5zeW0iLA0KICAgICAgICAgICAgICAgICAgIGN1dHBvaW50cyA9IGMoMCwgMWUtMDQsIDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEsMSksDQogICAgICAgICAgICAgICAgICAgc3ltYm9scyA9IGMoIioqKioiLCAiKioqIiwgIioqIiwgIioiLCAiXHUwMkQ5IiwgIiIpDQogICAgICAgICAgICAgICAgICAgKSAjJT4lDQogICNhcnJhbmdlKHZhbHVlKQ0KDQpwcm9jcnVzdGVzLmJhciA8LSBnZ2JhcnBsb3QobWVsdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeD0iVmFyaWFibGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5PSJ2YWx1ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb2xvciA9ICJWYXJpYWJsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gYygiaG9yaXpvbnRhbCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IE5BLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gIm1lYXN1cmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IG1lbHQkUHJGLnN5bSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiLnNpemUgPSA5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWIudmp1c3QgPSAwLjcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYi5oanVzdCA9IC0wLjMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQopICsNCiAgI3N0YXRfcHZhbHVlX21hbnVhbCgNCiAgIyAgYWRvbmlzLm1lbHQsICBsYWJlbCA9ICJQckYuc3ltIiwgdGlwLmxlbmd0aCA9IDAuMDENCiAgIykgKw0KICAjZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC4wNSkgKw0KICBnZ3RpdGxlKCIiKSArDQogIHhsYWIoIiIpICsNCiAgeWxhYigiUHJvY3J1c3RlcyB0ZXN0IHNpZ25pZmljYW5jZSIpICsNCiAgc2NhbGVfZmlsbF9qY28oKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KQ0KDQpwcm9jcnVzdGVzLmJhcg0KYGBgDQoNCiMgRmlndXJlcw0KDQojIyBGaWd1cmUgMQ0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTYsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KDQpwbG90X2dyaWQoYW1wX3Zpcl9nZW51cywNCiAgICAgICAgICBwbG90X2dyaWQoYmFyX2JhYyxiYXJfaG9zdCwNCiAgICAgICAgICBucm93ID0gMSwNCiAgICAgICAgICBsYWJlbHMgPSBjKCJCIiwiQyIpLA0KICAgICAgICAgIGxhYmVsX3NpemUgPSAzMCwgaGp1c3QgPSAwLjMsdmp1c3QgPSAxLA0KICAgICAgICAgIHJlbF9oZWlnaHRzID0gYygxLDEpLA0KICAgICAgICAgIHJlbF93aWR0aHMgPSBjKDEuMTUsMSkNCiAgICAgICAgICApLA0KICAgICAgICAgIG5yb3cgPSAyLA0KICAgICAgICAgIGxhYmVscyA9IGMoIkEiLCIiKSwNCiAgICAgICAgICBsYWJlbF9zaXplID0gMzAsIGhqdXN0ID0gMC4zLHZqdXN0ID0gMSwNCiAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMSwxLjUpDQopICsNCiAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMCwwLDAsMC41KSwgImNtIikpIA0KDQpnZ3NhdmUoIkZpZ3VyZXMvRmlndXJlIDEucG5nIix3aWR0aCA9IDI1LCBoZWlnaHQgPSAxNiwgdW5pdHMgPSAiY20iLCBkcGkgPSA0MDApIA0KDQpnZ3NhdmUoIkZpZ3VyZXMvRmlndXJlIDEudGlmZiIsd2lkdGggPSAyNSwgaGVpZ2h0ID0gMTYsIHVuaXRzID0gImNtIiwgZHBpID0gNDAwKSANCg0KZ2dzYXZlKCJGaWd1cmVzL0ZpZ3VyZSAxLnBkZiIsd2lkdGggPSAyNSwgaGVpZ2h0ID0gMTYsIHVuaXRzID0gImNtIiwgZHBpID0gNDAwKSANCmBgYA0KDQojIyBGaWd1cmUgUzENCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xNSwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQoNCnBsb3RfZ3JpZChwbG90X2dyaWQoYmFyX2JhY19mYW0sYmFyX3Zpcl9mYW1pbHksDQogICAgICAgICAgICAgICAgICAgIG5yb3cgPSAxLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwiQiIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbF9zaXplID0gMzAsIGhqdXN0ID0gMC4zLHZqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgcmVsX2hlaWdodHMgPSBjKDEsMSksDQogICAgICAgICAgICAgICAgICAgIHJlbF93aWR0aHMgPSBjKDEuMTUsMSkNCiAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICBwbG90X2dyaWQoYW1wX2JhY19nZW51cyxwbG90X2dyaWQodXBzZXQuYmFjLnRpbWUkTWFpbl9iYXIsdXBzZXQuYmFjLnRpbWUkTWF0cml4LG5yb3c9MixyZWxfaGVpZ2h0cyA9IGMoMywxKSwgc2NhbGUgPSAwLjg1KSwNCiAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDEsbGFiZWxzID0gYygiQyIsIkQiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxfc2l6ZSA9IDMwLCBoanVzdCA9IDAuMyx2anVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgIHJlbF9oZWlnaHRzID0gYygxLDEpLA0KICAgICAgICAgICAgICAgICAgICByZWxfd2lkdGhzID0gYygzLDEpDQogICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgcGxvdF9ncmlkKGFtcF92aXJfc3BlY2llcywgcGxvdF9ncmlkKHVwc2V0LnZpci50aW1lJE1haW5fYmFyLHVwc2V0LnZpci50aW1lJE1hdHJpeCxucm93PTIscmVsX2hlaWdodHMgPSBjKDMsMSksIHNjYWxlID0gMC44NSksDQogICAgICAgICAgICAgICAgICAgIG5yb3cgPSAxLGxhYmVscyA9IGMoIkUiLCJGIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVsX3NpemUgPSAzMCwgaGp1c3QgPSAwLjMsdmp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMSwxKSwNCiAgICAgICAgICAgICAgICAgICAgcmVsX3dpZHRocyA9IGMoMywxKQ0KICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgIG5yb3cgPSA0LA0KICAgICAgICAgIGxhYmVscyA9IGMoIiIsIiIsIiIpLA0KICAgICAgICAgIGxhYmVsX3NpemUgPSAzMCwgaGp1c3QgPSAwLjMsdmp1c3QgPSAxLA0KICAgICAgICAgIHJlbF9oZWlnaHRzID0gYygwLjcsMC44LDEpDQopICsNCiAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMCwwLDAsMC41KSwgImNtIikpIA0KDQpnZ3NhdmUoIkZpZ3VyZXMvRmlndXJlIFMxLnBuZyIsd2lkdGggPSAyNSwgaGVpZ2h0ID0gMzUsIHVuaXRzID0gImNtIiwgZHBpID0gMzAwKSANCg0KZ2dzYXZlKCJGaWd1cmVzL0ZpZ3VyZSBTMS50aWZmIix3aWR0aCA9IDI1LCBoZWlnaHQgPSAzNSwgdW5pdHMgPSAiY20iLCBkcGkgPSAzMDApDQoNCmdnc2F2ZSgiRmlndXJlcy9GaWd1cmUgUzEucGRmIix3aWR0aCA9IDI1LCBoZWlnaHQgPSAzNSwgdW5pdHMgPSAiY20iLCBkcGkgPSAzMDApIA0KYGBgDQoNCiMjIEZpZ3VyZSAyDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTIsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KDQpwbG90X2dyaWQocGxvdF9ncmlkKGJhYy5hbHBoYSx2aXIuYWxwaGEsDQogICAgICAgICAgbnJvdyA9IDEsDQogICAgICAgICAgbGFiZWxzID0gYygiQSIsIkIiKSwNCiAgICAgICAgICBsYWJlbF9zaXplID0gMzAsIGhqdXN0ID0gMC4zLHZqdXN0ID0gMSwNCiAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMSwxKSwNCiAgICAgICAgICByZWxfd2lkdGhzID0gYygxLDEpDQogICAgICAgICAgKSwNCiAgICAgICAgICBwbG90X2dyaWQoYmFjLmJldGEsdmlyLmJldGEsDQogICAgICAgICAgbnJvdyA9IDEsDQogICAgICAgICAgbGFiZWxzID0gYygiQyIsIkQiKSwNCiAgICAgICAgICBsYWJlbF9zaXplID0gMzAsIGhqdXN0ID0gMC4zLHZqdXN0ID0gMSwNCiAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMSwxKSwNCiAgICAgICAgICByZWxfd2lkdGhzID0gYygxLDEpDQogICAgICAgICAgKSwNCiAgICAgICAgICBwbG90X2dyaWQoQnJheVBsb3QuYmFjLjAsIEJyYXlQbG90LmJhYy4xNSwgQnJheVBsb3QuYmFjLjMwLCBCcmF5UGxvdC5iYWMuOTAsDQogICAgICAgICAgbnJvdyA9IDEsDQogICAgICAgICAgI2xhYmVscyA9IGMoIiIsIiIpLA0KICAgICAgICAgIGxhYmVsX3NpemUgPSAzMCwgaGp1c3QgPSAwLjMsdmp1c3QgPSAxLA0KICAgICAgICAgIHJlbF9oZWlnaHRzID0gYygxLDEpLA0KICAgICAgICAgIHJlbF93aWR0aHMgPSBjKDEuMTUsMSkNCiAgICAgICAgICApLA0KICAgICAgICAgIHBsb3RfZ3JpZChCcmF5UGxvdC52aXIuMCwgQnJheVBsb3QudmlyLjE1LCBCcmF5UGxvdC52aXIuMzAsIEJyYXlQbG90LnZpci45MCwNCiAgICAgICAgICBucm93ID0gMSwNCiAgICAgICAgICAjbGFiZWxzID0gYygiQyIsIkQiKSwNCiAgICAgICAgICBsYWJlbF9zaXplID0gMzAsIGhqdXN0ID0gMC4zLHZqdXN0ID0gMSwNCiAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMSwxKSwNCiAgICAgICAgICByZWxfd2lkdGhzID0gYygxLjE1LDEpDQogICAgICAgICAgKSwNCiAgICAgICAgICBucm93ID0gNCwNCiAgICAgICAgICBsYWJlbHMgPSBjKCIiLCIiLCJFIiwiRiIpLA0KICAgICAgICAgIGxhYmVsX3NpemUgPSAzMCwgaGp1c3QgPSAwLjMsdmp1c3QgPSAxLA0KICAgICAgICAgIHJlbF9oZWlnaHRzID0gYygxLDEsMC44LDAuOCkNCiAgICAgICAgICApICsNCiAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMCwwLDAsMC41KSwgImNtIikpDQogICAgICAgICAgDQoNCmdnc2F2ZSgiRmlndXJlcy9GaWd1cmUgMi5wbmciLHdpZHRoID0gMjUsIGhlaWdodCA9IDMwLCB1bml0cyA9ICJjbSIsIGRwaSA9IDMwMCkgDQoNCmdnc2F2ZSgiRmlndXJlcy9GaWd1cmUgMi50aWZmIix3aWR0aCA9IDI1LCBoZWlnaHQgPSAzMCwgdW5pdHMgPSAiY20iLCBkcGkgPSAzMDApDQoNCmdnc2F2ZSgiRmlndXJlcy9GaWd1cmUgMi5wZGYiLHdpZHRoID0gMjUsIGhlaWdodCA9IDMwLCB1bml0cyA9ICJjbSIsIGRwaSA9IDMwMCkgDQpgYGANCg0KIyMgRmlndXJlIFMyDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQoNCmdnYXJyYW5nZShyYWJ1LmJhYyxyYWJ1LnZpciwgY29tbW9uLmxlZ2VuZCA9IFRSVUUsIGxlZ2VuZCA9ICJib3R0b20iLGxhYmVscz1jKCJBIiwiQiIpLGZvbnQubGFiZWwgPSBsaXN0KHNpemUgPSAzMCksIGxhYmVsLnggPSAwLCBsYWJlbC55ID0gMSkNCg0KZ2dzYXZlKCJGaWd1cmVzL0ZpZ3VyZSBTMi5wbmciLHdpZHRoID0gMjUsIGhlaWdodCA9IDE1LCB1bml0cyA9ICJjbSIsIGRwaSA9IDMwMCkgDQoNCmdnc2F2ZSgiRmlndXJlcy9GaWd1cmUgUzIudGlmZiIsd2lkdGggPSAyNSwgaGVpZ2h0ID0gMTUsIHVuaXRzID0gImNtIiwgZHBpID0gMzAwKQ0KDQpnZ3NhdmUoIkZpZ3VyZXMvRmlndXJlIFMyLnBkZiIsd2lkdGggPSAyNSwgaGVpZ2h0ID0gMTUsIHVuaXRzID0gImNtIiwgZHBpID0gMzAwKSANCmBgYA0KDQojIyBGaWd1cmUgUzMNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCg0KZ2dhcnJhbmdlKGFscGhhLm1ldHJpY3MuYmFjLGFscGhhLm1ldHJpY3MudmlyLCBjb21tb24ubGVnZW5kID0gVFJVRSwgbGVnZW5kID0gImJvdHRvbSIsbGFiZWxzPWMoIkEiLCJCIiksZm9udC5sYWJlbCA9IGxpc3Qoc2l6ZSA9IDMwKSwgbGFiZWwueCA9IDAsIGxhYmVsLnkgPSAxKQ0KDQoNCmdnc2F2ZSgiRmlndXJlcy9GaWd1cmUgUzMucG5nIix3aWR0aCA9IDI1LCBoZWlnaHQgPSAxMCwgdW5pdHMgPSAiY20iLCBkcGkgPSAzMDApIA0KDQpnZ3NhdmUoIkZpZ3VyZXMvRmlndXJlIFMzLnRpZmYiLHdpZHRoID0gMjUsIGhlaWdodCA9IDEwLCB1bml0cyA9ICJjbSIsIGRwaSA9IDMwMCkgDQoNCmdnc2F2ZSgiRmlndXJlcy9GaWd1cmUgUzMucGRmIix3aWR0aCA9IDI1LCBoZWlnaHQgPSAxMCwgdW5pdHMgPSAiY20iLCBkcGkgPSAzMDApDQpgYGANCg0KIyMgRmlndXJlIDMNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCmZhbmN5LmFub3ZhLmJhci5jb21iLmhvc3QNCiNnZ2FycmFuZ2UoZmFuY3kuYW5vdmEuYmFyLmNvbWIuaG9zdCxsYWJlbHM9YygiQSIsZm9udC5sYWJlbCA9IGxpc3Qoc2l6ZSA9IDMwKSwgbGFiZWwueCA9IDAsIGxhYmVsLnkgPSAxLHdpZHRocyA9IGMoMSwwLjc1KSkNCg0KZ2dzYXZlKCJGaWd1cmVzL0ZpZ3VyZSAzLnBuZyIsd2lkdGggPSAyNSwgaGVpZ2h0ID0gMTgsIHVuaXRzID0gImNtIiwgZHBpID0gMzAwKSANCg0KZ2dzYXZlKCJGaWd1cmVzL0ZpZ3VyZSAzLnRpZmYiLHdpZHRoID0gMjUsIGhlaWdodCA9IDE4LCB1bml0cyA9ICJjbSIsIGRwaSA9IDMwMCkNCg0KZ2dzYXZlKCJGaWd1cmVzL0ZpZ3VyZSAzLnBkZiIsd2lkdGggPSAyNSwgaGVpZ2h0ID0gMTgsIHVuaXRzID0gImNtIiwgZHBpID0gMzAwKQ0KYGBgDQoNCiMjIEZpZ3VyZSBTNA0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KZ2dhcnJhbmdlKGRlc2VxMl9hbXBfYnBkX2JhYyxkZXNlcTJfYW1wX2JwZF92aXJfaG9zdCwgbGVnZW5kID0gIm5vbmUiLGxhYmVscz1jKCJBIiwiQiIpLGZvbnQubGFiZWwgPSBsaXN0KHNpemUgPSAzMCksIGxhYmVsLnggPSAwLCBsYWJlbC55ID0gMSx3aWR0aHMgPSBjKDEsMC43NSkpDQoNCmdnc2F2ZSgiRmlndXJlcy9GaWd1cmUgUzQucG5nIix3aWR0aCA9IDI1LCBoZWlnaHQgPSAxMCwgdW5pdHMgPSAiY20iLCBkcGkgPSAzMDApIA0KDQpnZ3NhdmUoIkZpZ3VyZXMvRmlndXJlIFM0LnRpZmYiLHdpZHRoID0gMjUsIGhlaWdodCA9IDEwLCB1bml0cyA9ICJjbSIsIGRwaSA9IDMwMCkgDQoNCmdnc2F2ZSgiRmlndXJlcy9GaWd1cmUgUzQucGRmIix3aWR0aCA9IDI1LCBoZWlnaHQgPSAxMCwgdW5pdHMgPSAiY20iLCBkcGkgPSAzMDApDQpgYGANCg0KDQojIyBGaWd1cmUgUzQgLSBDRD8NCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD00LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCmdnYXJyYW5nZShyYWJ1LmJhYy5zZ2EscmFidS52aXIuc2dhLCBsZWdlbmQgPSAiYm90dG9tIixsYWJlbHM9YygiQyIsIkQiKSxmb250LmxhYmVsID0gbGlzdChzaXplID0gMzApLCBsYWJlbC54ID0gMCwgbGFiZWwueSA9IDEsd2lkdGhzID0gYygxLDEpKQ0KDQpnZ3NhdmUoIkZpZ3VyZXMvRmlndXJlIFM0Yi5wbmciLHdpZHRoID0gMjUsIGhlaWdodCA9IDgsIHVuaXRzID0gImNtIiwgZHBpID0gMzAwKSANCg0KZ2dzYXZlKCJGaWd1cmVzL0ZpZ3VyZSBTNGIudGlmZiIsd2lkdGggPSAyNSwgaGVpZ2h0ID0gOCwgdW5pdHMgPSAiY20iLCBkcGkgPSAzMDApDQoNCmdnc2F2ZSgiRmlndXJlcy9GaWd1cmUgUzRiLnBkZiIsd2lkdGggPSAyNSwgaGVpZ2h0ID0gOCwgdW5pdHMgPSAiY20iLCBkcGkgPSAzMDApDQpgYGANCg0KDQojIFNlc3Npb24gaW5mbw0KDQpgYGB7cn0NCnNlc3Npb25JbmZvKCkNCmBgYA==